Joel on software

商业模式

Joel 提到了两种商业模式

  • 微软式的:前者进入的是一个充分竞争的市场,因此需要找好自己的定位,一步一个脚步的去慢慢发展自己,没有快速增长的可能性;
  • 亚马逊式:后者进入的是一个几乎没有竞争者、有规模效应或网络效应的市场,因此需要在前期大量花钱快速占领市场份额,因为最后只有一个公司会生存下来;

Joel 这个分析很有道理,它让我不得不思考自己的公司将来要如何定位自己的方向和模式;

鸡和蛋的问题

有些商业模式会遇到先有鸡和先有蛋的问题,Joel 给出的意见是提供向后兼容性,这样就可以破解这个问题,他说得很有道理;

他举了几个例子:

  • MS-DOS 系统对 CP/M 上的文字处理软件的兼容性;
  • PayMyBills 在开始时先让客户的账单寄送到自己的地址,然后为客户人工扫描成电子版;

如何阅读别人的代码

关键:放慢阅读的速度;

原因:同样长度的编程语言包含的信息量,要远大于普通的语言;但人们总是习惯是普通语言的阅读速度,学尝试阅读代码,这会让他们很挫败。因此人们总是倾向于重写代码,但这其实这将花费更多的时间;

方法:

  • 结队:和另外一个同事结队工作;将看到和想到的东西,大声说出来;
  • 讨论:如果不同意或不明白对方的意思,马上要求对方进行解释;
  • 跳过:有时候看不明白中间的某个东西,可以暂时跳过,等看完头尾后,再回来重新看中断部分,这个时候很有可能就看懂了;
  • 宏观与微观:从微观的角度,将单行代码翻译成普通语言;然后从宏观的角度,将整段代码翻译成普通语言;

产品竞争策略

如果产品进入的是一个已经被竞争对方完全占领的市场,那么就会面临如何让用户切换到使用自己的产品的问题;

用户的切换是有成本的,应提前罗列出每一个用户可能遇到的困难,并为它们想好对策,消除任何可能的障碍;避免用户在切换过程中,因为遇到困难而放弃了;

同时还要考虑如何让用户能够切换回旧的方式也很重要;例如 EXCEL 的例子;切换的过程不是一夜间全部发生的,而是一个陆续渐进的过程,这意味着即期有一部分尝鲜的客户很喜欢 EXCEL,他们也将面临一个障碍,即他们生成的 EXCEL 无法被同事或者客户打开;针对这个情况,EXCEL 为用户提供了兼容性,即可以将 EXCEL 存储成 LOTUS123 的版本;

如何吸引人才

  • 为他们提供舒适的、有吸引力的工作环境;
  • 去除在招聘过程中任何可能让候选人感到一丝丝犹豫的障碍;
  • 提供金钱之外的一些福利(由于批量采购的关系,福利实际比表面上的价格更省钱,至少省一半);
  • 以可接受的薪资成交,然后第二天再告知提高5%,让其心怀感激;

五个为什么与清单

人的大脑是不可靠的,而黑天鹅事件是不可预估的,因此通过五个为什么的方法,找到问题发生的根本原因;

将避免问题再次发生的操作写到工作清单中,让后续的每一次操作,都能够对照清单来执行,就像飞行员开飞机一样;

让清单代替大脑的思考,避免遗漏;

想赚钱别怕脏

帮客户解决的问题越是困难,其价值就越大,同时也意味着能够赚到更多的钱;

Office 复杂的文件格式

完全搞懂复杂的东西可能要付出很大的代价,一种变通的方法是把它封装起来,在需要的调用它即可,这样可以实现复杂性的隔离;

管理方法

提供愿景和使命,反复传播这些使命,让大家认同;激发每个人内心想变成更好的自己的欲望,变成由内部激励来驱动自己的工作,而不是从外部激励,因为那样很容易导致动作变形;

寸土必争

不放过每一个可以改进的小小细节,当积累到足够多数量后,它就会产生质变,让最终产品一眼看上去,就呈现出一种卓越的精品特质;

少即是多

不要给用户太多选择,因为人的大脑容量有限;选择太多的话,反而增加了决策的成本和负担,这样容易让用户感到无法胜任的无力感和不开心;

易用性的优先级

不解决问题的产品,易用性再好也是徒劳;能够解决问题的产品,是讨论易用性的前提;易用性确实是非常重要,它有助于留下更多的用户数量,但首先要有用户愿意进来;

社区

在工作和家庭之外,人们需要第三种空间。以前这些空间是实体的,如咖啡馆、酒吧、球馆等;现在这些空间变成虚拟的了;社区空间需要管理,否则它将会出现公地悲剧。总是有一些人自私的人,为了自己的利益,不惜牺牲他人,注意管理好他们;因为在社区中,有价值的总是少数人,多数人并不能贡献什么有趣的内容。但千万不要让那些无趣的人,把有价值的少数人给逼走了;

人们对社区有一种基因上需求,这方面有待读一些社会心理学方面的书籍进行深入了解;

开发时间规划

对于大的任务,我们估算的时间将非常不准确,因此不要以大任务为单位估算它们。应该将大任务,按照实现的步骤,拆分成多个小任务;这些小任务必须要非常小,小到可以在以小时为单位的时间内完成。之后将小任务的完成时间累计起来,就会得到大任务的完成时间;

事后记录小任务的实际完成时间,调整它在脑海中的概念,做为下一次估算的依据,这样一段时间下来,估算就越会越来越准确;

异常处理

原则:

  • 自己写的代码不要让它会抛出异常,这样后续调用它们时,就完全不用担心它们会抛异常,因此也不需要额外的去处理它们;
  • 调用别人写的代码时,因为不知道它们是否会抛异常,因此,在调用它们的地方,直接写上异常处理的办法,即当场 try…catch…,不留任何的后患;

性能

由于摩尔定律的存在,性能是开发软件过程中,考虑的优先级最低,因为即使短期内面临性能障碍,也很快会被硬件的不断进步所解决;

创办公司

提供最好的条件->找到最好的人->生产最好的产品->利润

点子和想法并不重要,因为只要有了优秀的人,他们自己会生产点子;

办公室设计

设计师:Roy Leone

  • 足够多的电源接口,有20个;
  • 八口的交换机,方便给多台电脑提供有线连接;
  • 预置布线槽,隐藏杂乱的电线;
  • 条型办公桌,方便结队编程;
  • 三面窗,两面采光;
  • 电脑桌墙上有一个可以看到隔壁办公室窗户的窗口(相当于每扇窗户被三个办公室共用);
  • 有休息区和娱乐区,让办公室比家更舒适和方便;

源代码

软件并不开源,但向客户提供源代码,这样当他们发现问题时,也可以尝试自行修复,之后将修复的代码合并进来,以便后续版本升级时,客户不会被影响;

简化性

重点是每个功能都能够帮客户解决问题,这样每个功能都能够带来收入;虽然 80/20 真的存在,但不同客户之间的 20% 并不相同;仅开发只有 20% 功能的精简版,但极大的影响收入来源;

重构与推翻

当一个软件已经上线运行一段时间后,例如1年,由于各种历史的原因,在一开始的时候埋下了一些错误,它有可能变得难以维护。这时候千万不要推翻重来,而是先要各种简单容易的重构,例如将代码按规范格式化、将大函数拆成小函数、优化成有意义的变量名称等;这些工作都非常小,也不容易引入错误,同时也不会影响现有软件的运行。

当这个工作持续到一定的程度,代码就会在不知不觉变得好了起来,相比推翻重来,它将省下大量的时间,因为它并不触及到对原有核心代码的修改,却让代码变得容易维护了。

客服支持

客户遇到问题,你帮他解决了,客户实际上变得比没有问题时还要满意。

无理由退款

90天内,无偿退款。即使超过了90天,也仍然可以退款,任何时候,都可以退款。

原因:确实有人会退款,但是那只占很少的比例。但是由于有无限制的退款策略,会让下单的人感觉到很放心,因此试用的人反而会去增加很多很多,因为他们没有任何的决策成本。

发布策略

在完成一个比较成熟的软件版本前,先不要大规模的宣传,而是寻找一些愿意尝鲜的客户,让他们先试用产品,帮助他们解决问题,然后在这个过程中不断完善产品,直到 2.0 版就绪;因为面市的是一个不成熟的产品,那么人们会留下不好的第一印象,之后很难改变人们的第一印象,即使后续软件已经改进了,他们也不愿意再做一次尝试;

发布频率

软件不适宜过于频繁的发布,因为它可能导致用户经常处于学习的状态中,导致想起他们的反感。每隔一段时间再集中发布一次,并且在界面样式上能够感觉到更新,这样用户会不自觉的发现有变化,然后在使用的过程中会小心一点;

确定优先级

  1. 罗列所有待开发的功能;
  2. 用1到10为每个功能的开发成本打分,区分小型任务、中型任务、大型任务;
  3. 给每个人有限的预算,例如 50 元,让他们购买他们想要的功能;
  4. 每个功能的销售额除以成本,得到投入产出比;
  5. 按投入产出比从大到小,作为开发顺序;

Joel on software
https://ccw1078.github.io/2020/12/06/Joel on software/
作者
ccw
发布于
2020年12月6日
许可协议