本书的封面
第一部分 人员的管理
- billgates的审查
对产品经理提出一系列越来越难的问题,直到产品经理答不出来为止。目的是测试产品经理有没有准备充分以及对目标有没有把握。
- 寻找优秀程序员的三种办法
- 社招(简历)不靠谱,员工推荐不太靠谱
- 走出去,参加开发者大会
- 找实习生。
- 创造自己的知名社区网站。
- 管理的三种方法
方法
| 说明 | 缺点 |
军事化管理法
| 军队可以让士兵绝对服从命令 | 1.会使团队人员不爽 2.不可能管理到所有细节 3.对于技术问题,程序员才是做决策的最佳人选,因为他们知道更多的技术细节。 |
经济利益驱动法
| 假设每个人的行为动机都是钱 |
1.会降低团队人员的内部驱动力,当你停止付钱或者他们不再需要钱,他们的驱动力就会消失。
2.员工会追求局部利益最大化,最终为了自己的利益可能做出对公司不好的行为。
3.会鼓励员工与制度博弈,寻找制度的缺失之处来为自己谋利。
经济利益驱动法更像是管理的退位,表面上简化了管理,但实际上却是管理的缺失。
|
认同法
|
方法:
1.培养认同感。设定积极的目标和价值观。
2.培养凝聚力和归属感。团队的人要一起吃饭,多组织集体活动。
3.信息共享。和员工要做到信息共享,以便员工更好的工作。
| 实施起来不容易。 |
第二部分 写给未来程序员的建议
- 学校只教java的危险性
不学指针(看不懂操作系统的内核)和递归(无法理解优雅的程序),不学函数式编程(并发无副作用),学校无法剔除那些不适合当程序员的人。
企业不能判断哪些是合格的程序员。
作者认为java不够难,而教育界则讨论的是java作为入门级语言教学是否够简单。
- 在耶鲁大学的演讲
作者在本科学到了如何写作,不要读研究生,unix和windows的区别。
- 给计算机系学生的建议
第三部分 设计的作用
- 字体平滑、反锯齿和次像素渲染
苹果公司的设计有利于频幕界面和印刷一致
微软公司的设计有利于屏幕阅读
苹果的字体放到微软的系统上面会有一点模糊,比如在mac上面装windows系统,字体会变模糊。
- 寸土必争
随便找一个东西,如果你找不到它的缺点,那就说明你的转型还没有成功。
- 大构想的陷阱
阅读的时候,眼镜只会盯住一个点,而其它地方像素很低,但是由于眼镜的注意力快速移动,让你产生了你已经看到了所有细节的错觉。软件设计中,你以为你可以做出来,看上去大体流程很清楚,但是一旦你考虑细节的时候你才会知道,你少考虑了很多东西。
- 别让用户做太多选择
微软的关机选项有7种,再加上电源键(点击和长按)或者一些电脑上有快捷键关机或者重启,合下屏幕也可以睡眠或者关机。这样给用户的选择就有10种左右,而过多的选择会让用户产生选择困难而失去幸福感。
如何改进?
Switch User之前肯定要Lock,这两个按钮可以合并。
Log Off就是为了退出当前运行的所有程序,可以和ShutDown按钮合并。
Restart和shutdown是一样的,只需要按两次shutdown按钮即可(假设关机速度很快,而且不是远程操控(一般远程操控是命令行操作))
Sleep和Hibernate说实话我不太懂他们的区别。
现在我们只剩下 switch user/lock log off/shutdown hibernate/sleep三个按钮。
考虑switch user/lock hibernate/sleep这两个按钮的合并,当我按下这一个复合按钮的时候,会弹出一个切换用户的对话框,然后30秒内没有切换用户会进入休眠状态,而这个过程中计算机是一直锁定的。
现在计算机只剩两个按钮了,就是这两种状态:
1、我要离开电脑一会儿
2、我要离开电脑很久,需要拔下电源
现在考虑能不能合并这两个按钮,现在的电源管理系统已经能够做到你在睡眠状态下不关闭电脑也只耗很低的电源,即使你拔掉电源也能够保存你的数据,不会损失你的任何数据,所以这两个按钮完全可以合并。
- 易用性是不够的
- 用软件搭建社区
第四部分 管理大型项目
- 火星人的耳机
这一部分主要讲述了为什么现在的web标准如此复杂。
一对多模式:假设你在火星上发现火星人还在使用录音机,你发现了商机,你决定卖mp3给他们,为此你要制造一种耳机,于是你写了一份规格书,让其他厂商制造耳机,但是你的规格书里误写了电压的参数,结果厂商做出来的耳机总是爆炸,然后经过调整声音的赫兹终于能正常使用了,就这样你让火星人大量买了你的耳机,然后你想让你的耳机拥有打电话的功能,就是加一个麦克风,然后你重新设计了一个适配器,这个适配器考虑了以后的升级问题,但是推出以后火星人根本没人买,他们只在乎家里收藏了一衣柜的耳机,根本不在乎什么麦克风功能。然后你只有在耳机的接口处扩展功能,把耳机的金属轴接口分成三份,其中一份可以用来做麦克风功能,你又设计了一份协议,在接口处发射一个信号,当mp3找到这个信号的时候,就开启麦克风模式,否则就开启向后兼容的耳机模式,现在,整个市场就变成了一对多模式,同一个耳机有多个版本了。
多对多模式:由于你不停的给mp3增加功能,每个生产耳机的厂商都要把耳机在每一个mp3型号测试一遍,由于规格书的繁琐难读,有些产品出现了不兼容的现象,然后为了降低成本,厂商不得不只让耳机适配最流行的mp3播放器,这样,当耳机插入其他mp3的时候,会播放不出来或者更严重的会爆炸。原因是规格书有一个功能写得不清楚,比如,如果下雨,电压会升高,如果不下雨,电压不变。但是关于下雪,规格书没有讲,有的地方把下雪当成了下雨的一种,原因是都要用到雨刮器。有的地方从不下雪,所以就不是下雨。
然后有一个无聊的家伙,发表了一篇文章,利用漏洞可以解决兼容问题,比如用程序把下雪也误判成下雨,于是市场上就出现了多个版本的耳机和mp3,这就是多对多。
微软的ie8就是类似上面的流程。
- 为什么微软office的文件格式如此复杂
- 要挣钱就别嫌脏
第五部分 编程建议
- 询证式日程规划
完后速率 = 估计用时/实际用时
蒙特卡洛方法估计值:
- 关于战略问题的通信之六
- 你的编程语言做得到吗
不受限制的对象(函数指针,匿名函数)
并行编程(比如有两个cpu,让你的循环分成两半在每个cpu上执行,速度会快上将近一倍)
- 让错误的代码显而易见
网站中,用户输入的字符串必须经过编码后才能使用,否则有可能会受到攻击。
怎样才能尽量避免这种出错方式呢?
第一种办法:当用户的数据一传进来,就对数据进行编码。但是当需要直接存到数据库的时候实际上是要存储原来的字符的,所以不行。
第二种办法:制定一种规范,只有输出字符串的时候才进行编码,但是有个问题,有些要输出的字符串是不可以进行编码的,比如包含html语句的(换行等)。
第三种方法:设置中间变量,所有用户输入的字符串都必须赋给以us开头的变量,所有已知安全的字符串和包含html的字符换,都赋给s开头的变量。
这样子,可以判断
还有一种更简明的办法,重命名函数,
- 把相同的代码放在一起
把相同的代码尽量放到一起,将有助于帮你发现你程序的错误。
比如:
i = j*5
c语言可以一眼看出这句代码的意思,但是c++中必须要考虑到i和j的数据类型,以防进行了运算符重载,还要考虑继承和多态的问题。所以在c++中这样抽象不是好的行为。
详见抽象漏洞原理:点击打开链接
- 匈牙利命名法
匈牙利命名法不是变量类型加变量名,而是类型(不同用途)加上变量名,比如
很多人误以为type就是变量类型,但是这除了提供变量类型没有提供任何有用信息。
- 异常处理
异常处理破坏了代码的邻近性,在小程序中没有问题,但是在大程序中,会使得程序的关联性受损。
另外宏在大型程序中也要少用,否则你在看一个变量的时候将跳到其它页面,很麻烦。
注:此书后面有关软件公司及软件发布部分未读,原因是暂时还用不到这方面的知识。