程序员的圣经

Web工程师的经验之谈

**做框架的态度**
1. 不要因为困难的而不去做
2. 辨认是否真的做不了
3. 将用户当傻瓜(不要让使用者做得太多)
4. 框架技术选择(大众化)
**JavaScript**
1. 控件本质(对于DOM元素的位置变换、隐现,事件的控制)
2. 注意重用(加强复用东西(组件、控件)的编写能力挺重要)
**Hybrid框架(mobile)**
1. 如何做得像原生做的
2. 别用单页
**部署自动化**
1. 能自动化的东西,就别手动做(程序打包编译都应该实现自动化)
2. 把开发人员解放出来(当你花几天做出自动化东西,会发现后面省下的时间何止几天)
**对学习的问题**
1.学习只能靠自己
2.多学习多总结(学习东西必须有结论)
**对错误的态度**
1.不要怕(对于错误,先理清问题到底是什么,然后考虑怎么解决)
2.承认做不了(自己做不了,就承认做不了,别死鸭子嘴硬,到后面出问题了再说,那就尴尬了)
**对于自我**
1. 直面不足(我不是个聪明的人,只是还有些小勤奋,我会花时间去弄懂)
2.成为别人的依靠(使得自己在某些方面是别人完成不了最后一个依靠)
3.有些偏执了(随着我看到的东西越来越多,知道得越多,越能认清一个东西对错好坏,对于我认为不对的,就不妥协,一定指出来)
4.小进步(我追求是每天有一点不同,每天有一点小进步)

编程总结

**开发**
从小事做起,然后再扩展
一次只做一件事
尽早地添加日志和错误处理
每一行新代码必须至少执行一次
在整体测试之前先进行模块测试
所有事情所花费的时间总是比你预期的要长
先了解现有的代码
阅读和运行代码
**故障排除**
Bug 总是难免的(BUG的定义基本上是:“我们没有想到”)
解决故障报告(每个开发人员都应该花时间去处理来自客户的故障报告,并修复bug,这能让你更好地理解客户的意图。)
重现问题
修复已知错误,然后再看看有没有其他不对的地方
没有巧合
关联时间戳
**合作**
面对面的交流最有效
小黄鸭调试法
问问题
共享荣誉
**其他**
动手去做
带着问题睡觉
改变/跳槽(不要害怕角色变化。和不同的人共事,开发不同的产品,感受不同的公司文化是非常有意思的。)
活到老学到老(有机会可以学到新的东西。你可以尝试不同的编程语言和工具,阅读软件开发的书籍,接受MOOC课程。)

习惯:

1.要有负责心
    在我们的每日工作中,有一半以上时间是在解决各种Bug。高级程序员在面对这些Bug时会从多个维度思考,Bug出现的时间、系统环境、硬件版本以及软件版本等等。接着修复问题,严格自测,上线后观察,一直会跟进到底,把影响降低到最小。
    他们会主动承担责任,为结果负责。面对各种问题时,不是第一时间为自己找借口,不是互相推脱,互相指责。而是,想尽一切办法解决问题,即使解决不了,也会给出最优选择。
    责任心在程序员的职业生涯中,具有最重要的指导意义,也是成为高级程序员必须具备的素质。
2.掌握代码调试技巧
    众所周知,在移动互联网时代,基于市场和需求的变化,项目周期的变化也会很快。有时一个月的工作计划,会缩短到2个星期。面对巨大的项目压力,程序员的代码质量会有所下降。
    这时调试技巧就尤为重要。一行代码的输入输出要清楚,一个函数的输入输出要明确而具体。高级程序员会在函数的开始和结束输出Log,把所有的参数和返回值打印到日志系统,便于追踪。在解决问题的过程中,使用开发工具一行一行进行调试,实时观看参数的变化。
    高级程序员清楚的知道他写的每一行代码在项目中的作用和意义。
3.不要重复造“轮子”
    我们对代码的记忆最多只有2天,如果代码没有注释说明,也许第二天一早就会忘记它的具体意义。30天之前写的代码相信没几个人会记得。
    重复是怎样发生的呢?-1.程序员们没有意识到他们在重复。-2.程序员们偷懒,他们重复,因为那样似乎更容易。-3.同一个团队的几个人重复同样的信息。
    新需求持续进行迭代,需求的变化导致代码需要重新修改。这时的程序员也未必是当初那个程序员,导致隐藏的问题产生,产品到用户手上随时可能会爆发问题。
    高级程序员会尽力避免开发重复的代码,组装成公共组件库是最好的选择。
4.尽量使你的程序解耦
    全球首位计算机博士David Wheeler曾经说过这样一句话,“计算机科学领域的任何问题都可以通过增加一个中间层来解决”。这句话诠释了解耦的重要性。网络七层协议的设计,软件开发的设计中,数据层、服务层和应用层,无不参考这位伟大计算机博士的思想。
    生活中随处可见这样的例子。共享单车的出现,就是对我们出行的解耦合。你要做的就是在你需要的时候去使用,不需要了解更多的细节,出现问题了也不需要你去维修,只管用就好。
    高级程序员开发的代码,既屏蔽细节,又提高了灵活性。
5.适当的进行重构
    重构是改善现有代码的设计。在给外部提供接口不变的前提下,随着时间的推移,在内部重写、重做和重新架构代码。
    什么时间做最好?做的太早,看不出有做的必要性。做的晚,耗费大量的时间周期,会影响当前的项目。
    初期的系统架构设计以简单、易用为主。在创业公司35个人一个小队,开始了一个项目。在人力资源匮乏的条件下,首要任务是先把系统搭建起来,短期实现基础版。后期随着需求的增加,系统变得庞大。早期的架构明显有些弊端,不能跟随项目进行发展。这时候重构就势在必行了。
    高级程序员清楚在什么时间点进行重构。在不影响外部系统的情况,重新开发,提供更稳定的服务。
6.积累自己的代码库
    如果你做了多年的软件开发,没有积累自己的代码库,没有做好笔记。面对新的项目,所有代码重写一遍。无疑了浪费了很多时间。网络上也可以下载到相关代码,但随手的一个小功能,如果在自己的代码仓库里积累好。也省去了搜索的时间。
    高级程序员会积累自己的代码仓库。
7.实践、实践、再实践
    有很多原则和道理我们听过无数遍,但是从来没有去实践。如果不经过几十万行代码的锤炼。很难达到一个高度。外部环境的支撑很重要。但是,如果没有这样的机遇,就需要我们创造条件去寻找。

开发经验:

一、对于团队而言,流程太重要了。(各司其责+节奏)
二、不要炫技,老老实实写代码。(想清楚了再决定用什么+最好是跟随成功项目的脚步)
三、架构上实用+适用。(在当前阶段达到:开发效率+架构的平衡;并向后展望3-6个月,看看架构能不能适应。)
四、既要有攻城之力,也要有熬战之气——BUG。(不了解+粗心大意+使用情况各异导致的)
五、自审。(到底是在承担过去,还是在改变未来)
六、注释。(为了自己以后维护的方便+为了其他人接手的方便)
七、代码结构。(干净+整洁)
八、代码风格。(好比一家人)
九、安全与逆向。(加固+混淆+代码判断)
十、开发效率。
十一、安装包体积。
十二、UI渲染效率。(快并稳定)

Java 代码性能优化:

减小代码的体积+提高代码运行的效率
1、尽量指定类、方法的final修饰符
类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写。如果指定了一个类为final,则该类所有的方法都是final的。Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行效率作用重大。
2、尽量重用对象
Java虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理。
3、尽可能使用局部变量
栈中创建的变量,随着方法的运行结束,这些内容就没了,不需要额外的垃圾回收。
4、及时关闭流
5、尽量减少对变量的重复计算
6、尽量采用懒加载的策略,即在需要的时候才创建
7、慎用异常
8、不要在循环中使用trycatch…,应该把其放在最外层
9、如果能估计到待添加的内容长度,为底层以数组方式实现的集合、工具类指定初始长度
10、当复制大量数据时,使用System.arraycopy()命令
11、乘法和除法使用移位操作
12、循环内不要不断创建对象引用
13、基于效率和类型检查的考虑,应该尽可能使用array,无法确定数组大小时才使用ArrayList
14、尽量使用HashMap、ArrayList、StringBuilder,除非线程安全需要,否则不推荐使用Hashtable、Vector、StringBuffer
15、不要将数组声明为public static final因为这毫无意义,这样只是定义了引用为static final,数组的内容还是可以随意改变的,将数组声明为public更是一个安全漏洞,这意味着这个数组可以被外部类所改变
16、尽量在合适的场合使用单例(资源的使用+实例的产生+数据的共享)
17、尽量避免随意使用静态变量
当某个对象被定义为static的变量所引用,那么gc通常是不会回收这个对象所占有的堆内存的。
18、及时清除不再需要的会话
19、实现RandomAccess接口的集合比如ArrayList,应当使用最普通的for循环而不是foreach循环来遍历
20、使用同步代码块替代同步方法
21、将常量声明为static final,并以大写命名这样在编译期间就可以把这些内容放入常量池中,避免运行期间计算生成常量的值。另外,将常量的名字以大写命名也可以方便区分出常量与变量。
22、不要创建一些不使用的对象,不要导入一些不使用的类。
23、程序运行过程中避免使用反射。
24、使用数据库连接池和线程池。
25、使用带缓冲的输入输出流进行IO操作。
26、顺序插入和随机访问比较多的场景使用ArrayList,元素删除和中间插入比较多的场景使用LinkedList。
27、不要让public方法中有太多的形参。
28、字符串变量和字符串常量equals的时候将字符串常量写在前面。
29、请知道,在java中if (i == 1)和if (1 == i)是没有区别的,但从阅读习惯上讲,建议使用前者
30、不要对数组使用toString()方法
31、不要对超出范围的基本数据类型做向下强制转型
32、公用的集合类中不使用的数据一定要及时remove掉
33、把一个基本数据类型转为字符串,基本数据类型.toString()是最快的方式、String.valueOf(数据)次之、数据+””最慢
34、使用最有效率的方式去遍历Map
35、对资源的close()建议分开操作

Mysql数据库32条军规

1、不在数据库做运算,cpu计算务必移至业务层
2、控制单表数据量:int型不超过1000w,含char则不超过500w;
    合理分表;限制单库表数量在300以内;
3、控制列数量:字段少而精,字段数建议在20以内;
4、平衡范式与冗余:效率优先;往往牺牲范式;
5、拒绝3B:拒绝大sql语句:big sql;拒绝大事务:big transaction;拒绝大批量:big batch;
6、用好数值类型:tinyint(1Byte);smallint(2Byte);mediumint(3Byte); int(4Byte); bigint(8Byte)
7、字符转化为数字:用int而不是char(15)存储ip;SELECT INET_ATON('192.168.1.200');    
8、优先使用enum或set:例如:sex enum (‘F’, ‘M’)
9、避免使用NULL字段:NULL字段很难查询优化; NULL字段的索引需要额外空间; NULL字段的复合索引无效;
10、少用text/blob:varchar的性能会比text高很多;实在避免不了blob,请拆表;
11、不在数据库里存图片
12、谨慎合理使用索引:
改善查询、减慢更新;索引一定不是越多越好;覆盖记录条数过多不适合建索引,例如“性别”;
13、字符字段必须建前缀索引
14、不在索引做列运算
15、innodb主键推荐使用自增列;
16、不用外键:请由程序保证约束;
17sql语句尽可能简单:一条sql只能在一个cpu运算;大语句拆小语句,减少锁时间;一条大sql可以堵死整个库;
18、简单的事务:事务时间尽可能短;
19、避免使用trig/func:触发器、函数不用;客户端程序取而代之;
20、不用select *:消耗cpu,io,内存,带宽;
21OR改写为IN(): or的效率是n级别; in的消息时log(n)级别; in的个数建议控制在200以内;
22OR改写为UNION: mysql的索引合并很弱智;
23、避免负向%
24、慎用count(*)
25、limit高效分页: limit越大,效率越低;
26、使用union all替代unionunion有去重开销;
27、少用连接join
28、少用group by:分组;自动排序;
29、请使用同类型比较
30、使用load data导数据:load data比insert快约20倍;
31、打散批量更新
32、新能分析工具

前端优化:

[内容]尽量减少HTTP请求数
[内容]减少DNS查找
[内容]避免重定向
[内容]延迟加载组件
[内容]预加载组件
[内容]减少DOM元素的数量
[内容]跨域分离组件
[内容]尽量少用iframe
[内容]杜绝404
[内容]让Ajax可缓存
[服务器]使用CDN(Content Delivery Network)
[服务器]添上Expires或者Cache-Control HTTP头
[服务器]Gzip组件
[服务器]配置ETags
[服务器]尽早清空缓冲区
[服务器]对Ajax用GET请求
[服务器]避免图片src属性为空
[cookie]给Cookie减肥
[cookie]把组件放在不含cookie的域下
[css]选择 舍弃@import
[css]避免使用滤镜
[css]把样式表放在顶部
[css]避免使用CSS表达式
[js, css]把JavaScript和CSS放到外面
[js, css]压缩JavaScript和CSS
[js]去除重复脚本
[js]尽量减少DOM访问
[js]用智能的事件处理器
[js]把脚本放在底部
[图片]优化图片
[图片]优化CSS Sprite
[图片]不要用HTML缩放图片
[图片]用小的可缓存的favicon.ico(P.S. 收藏夹图标)
[移动端]保证所有组件都小于25K
[移动端]把组件打包到一个复合文档里

你可能感兴趣的:(程序员)