代码精进之路
范学雷
Oracle首席软件工程师,Java SE安全组成员,OpenJDK评审成员
立即订阅
6325 人已学习
课程目录
已完结 47 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 你写的每一行代码,都是你的名片
免费
第一模块:代码“规范”篇 (16讲)
01 | 从条件运算符说起,反思什么是好代码
02 | 把错误关在笼子里的五道关卡
03 | 优秀程序员的六个关键特质
04 | 代码规范的价值:复盘苹果公司的GoToFail漏洞
05 | 经验总结:如何给你的代码起好名字?
06 | 代码整理的关键逻辑和最佳案例
07 | 写好注释,真的是小菜一碟吗?
08 | 写好声明的“八项纪律”
09 | 怎么用好Java注解?
10 | 异常处理都有哪些陷阱?
11 | 组织好代码段,让人对它“一见钟情”
12丨组织好代码文件,要有“用户思维”
13 | 接口规范,是协作的合约
14 | 怎么写好用户指南?
15 | 编写规范代码的检查清单
16丨代码“规范”篇用户答疑
第二模块:代码“经济”篇 (14讲)
17 | 为什么需要经济的代码?
18丨思考框架:什么样的代码才是高效的代码?
19 | 怎么避免过度设计?
20 | 简单和直观,是永恒的解决方案
21 | 怎么设计一个简单又直观的接口?
22丨高效率,从超越线程同步开始!
23 | 怎么减少内存使用,减轻内存管理负担?
24 | 黑白灰,理解延迟分配的两面性
25 | 使用有序的代码,调动异步的事件
26 | 有哪些招惹麻烦的性能陷阱?
27 | 怎么编写可持续发展的代码?
28 | 怎么尽量“不写”代码?
29 | 编写经济代码的检查清单
30丨“代码经济篇”答疑汇总
第三模块:代码“安全”篇 (14讲)
31 | 为什么安全的代码这么重要?
32 | 如何评估代码的安全缺陷?
33 | 整数的运算有哪些安全威胁?
34 | 数组和集合,可变量的安全陷阱
35 | 怎么处理敏感信息?
36 | 继承有什么安全缺陷?
37 | 边界,信任的分水岭
38 | 对象序列化的危害有多大?
39 | 怎么控制好代码的权力?
40 | 规范,代码长治久安的基础
41 | 预案,代码的主动风险管理
42 | 纵深,代码安全的深度防御
43 | 编写安全代码的最佳实践清单
44 | “代码安全篇”答疑汇总
加餐 (1讲)
Q&A加餐丨关于代码质量,你关心的那些事儿
结束语 (1讲)
结束语|如何成为一个编程好手?
代码精进之路
登录|注册

27 | 怎么编写可持续发展的代码?

范学雷 2019-03-06
成功的大公司,也是从小公司起步的。刚开始的时候,软件可能比较简单,用户也比较少,一台廉价的服务器,或者一个简单的虚拟机,甚至几个静态的页面就绰绰有余。
很快,辛苦的努力得到回报,产品传播速度远超预期,用户很喜欢公司的产品或者服务,数量大幅增加,需求越来越强劲。这时候也是公司最忙碌的时候,每个人眼里只有两个字:“增长”。用户规模增长随之带来的是软件规模增长,运维复杂度增长。这时候,廉价的服务器满足不了需求了,就需要更多的服务器,甚至是各种用途不一样的服务器,还需要使用更多的带宽、更多的内存、更多的 CPU,甚至更多的硬盘。
跟得上增长的公司,用户会越来越喜欢,就会脱颖而出,每一份辛苦都得到了优厚的回报;跟不上增长的,用户会越来越抱怨,公司会被迅速模仿,然后用户被抢走,公司被迅速甩开,每一份辛苦都成了一声叹息。
增长对软件的要求,就是要有处理越来越多工作和越来越大规模的能力或者潜力。这种能力,通常称之为可伸缩性(Scalability)。
不过,要提醒的是,也有人使用“可扩展性”这个词表示规模的扩张能力。可扩展性这个词汇很多时候也用于表示功能的扩展(Extensibility)。这就容易混淆规模扩展和功能扩展这两个完全不一样的概念。如果有人使用了可扩展性这个概念,要弄清楚指的是规模还是功能。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《代码精进之路》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(5)

  • hua168
    怎么判断代码是否使用分布式?

    1.是不是看企业将来战略要求?
    他们一般都会说将来用户量大,但是开发人员就那么几个,是不是一开始就弄分布式,只不过放在一两台服务器上,当用户量增加再慢慢分离?

    2.看公司未来3年是否用户量增加到要代码拆分的程度?
      如果用到最好前期就开始做吗?


    像我们水平扩展,做分布式,前期java web比较多的组合是
    nginx+spring Boot+dubbo(spring cloud)+redis+mongoDB/mysql

    nginx:反代,主要是处理静态,分担tomcat压力,前期和spring Boot1台
    spring Boot+dubbo(spring cloud):含tomcat,解决代码水平扩展,前期1台服务器
    redis:保存状态数据,一般是session比较多,前期做主从,前期一般2台
    mongoDB/mysql:数据库,只在数据,前期一般2台

    如果访问量过大:
      1. 数据库方面:变成1主多从,如果压力大就分库,再大就分表做sharding
      2. 前上面组合中前面添加多一个web代理,如nginx/haproxy,
         包含代码的web服务器复制几台现来,再做七层代理,如果一个七层代理不够,前面再加4层LVS
      3. redis:做成群集

    作者回复: 谢谢你的分享。这些是很好的经验!

    前期要考虑代码对分布式的支持,不一定真要做成分布式的。实际的分布式方案,最终还是取决于代码是什么样的。

    比方说我们文章中说到了,分离无状态数据,无状态服务。如果这些做好了,有状态服务可能只是很小的一块内容。这些早点做,可以提高系统的性能,延迟分布式的需求,简化分布式的实施。

    2019-03-07
    4
  • 轻歌赋
    所以一个web程序可以将信息简单分为三类
    1. 静态数据,客户端缓存,主要思考方向在如何让客户端更多的缓存,并且服务端能够随时消除缓存
    2. 无状态动态数据,可以考虑在单实例做缓存,提高效率,但是需要考虑如何通知清理缓存,怎么样设计缓存可以尽可能细粒度的清理缓存
    3. 有状态数据,可以考虑在redis等系统级的缓存处缓存,考虑到系统的扩张,一台缓存可能不够用,需要算法层次考虑分散用户数据,确保一个用户只会进入一部分缓存

    对于3,之前看过对于用户的ID进行hash的方式,但是感觉当缓存实例数量变化的时候取模是个问题,请问老师,这点如何在算法上进行设计呢?

    作者回复: 抱歉,我不了解redis。我猜测啊,模的值是不是可以等于缓存机器的数目?

    另外,等拿到用户ID的时候,已经进入应用层了,这时候连接可能已经建立,性能的瓶颈可能就是建立连接的前置的分配器。

    2019-03-06
    1
    2
  • hua168
    老师,之后的会介绍一些简单的防攻击之类的吗?我觉得代码写的再好,如果很容易被入侵,那也是等于0,我前公司网站经常时不时被入侵还不知道怎么回事T_T,服务器安全没有什么问题。
    防攻击是靠java的安全框架,还是自己手工写的防攻击代码?还是直接加多一层专门用来做防攻击过滤?
    起码保证代码是安全的,如果是网络类有专业的防火墙,如DDOS防火墙。

    作者回复: 安全漏洞大部分都是代码引起的,防火墙这些措施很重要,但是只能防范一部分攻击,价值最大的防范,要在代码层解决掉。我们第三部分会重点讲代码安全。

    2019-03-07
    1
  • hua168
    如果分布式前期已确定好(如:SpringBoot+redis+mysql)代码写好之后,如果再加多一些安全过滤来防攻击,是不是在直接在SpringBoot加多一层安全过滤?因为我在网上看到过这么一句话:

    Any problem in computer science can be solved by anther layer of indirection.
    计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。

    作者回复: 接着的问题是,这个中间层会有多复杂呢,值不值得呢?

    对于安全来说,中间层解决不了所有问题。很快,我们就进入这个专栏的第三部分了,到时候我们再聊代码安全问题。

    2019-03-07
    1
  • 夜空中最亮的星(华仔)
    有启发 有收获
    2019-03-06
收起评论
5
返回
顶部