CodingTour
Make something people want

“Make something people want” 是保罗·格雷厄姆的名言,今天随便聊一聊从保罗·格雷厄姆身上学到的和扩展出来的一些东西~

士气与心力

“小步快跑、快速迭代” 已经是产品研发的方法论了,软件开发之所以可以这样做,是因为原型(prototype)并不只是模型(model),不等于将来一定要另起炉灶,完全能够在原型的基础上直接做出最后的成品,这样的方式使得你可以利用在开发过程中一路产生的新想法,不断推陈出新,如同先画出一个大致准确的轮廓,然后再逐步地加工出来。

保罗·格雷厄姆在《黑客与画家》中提到:

士气是设计的关键因素。令我吃惊的是,大家很少提到这一点。我的一位美术启蒙老师告诉我:如果你觉得画某样东西很乏味,那么你画出来的东西就会真的很乏味。比如,假设你必须画一幢建筑物,你决定从每一块砖头开始画起。你觉得自己可以坚持下去,但是画到一半的时候突然感到很厌倦,于是你就不再认真观察每块砖头并画出它们各自不同的特点,而是以一种机械重复的方式草草地把砖头画完了事。这样一来,你的作品效果就很差,甚至还不如一开始就不采用写实手法,只是若隐若现地暗示砖头的存在。

先做出原型,再逐步加工做出成品,这种方式有利于鼓舞士气,因为它使得你随时都可以看到工作的成效。开发软件的时候,我有一条规则:任何时候,代码都必须能够运行。如果你正在写的代码一个小时之后就可以看到运行结果,这好比让你看到不远处就是唾手可得的奖励,你因此会受到激励和鼓舞。其他艺术领域也是如此,尤其是油画。大多数画家都是先画一个草图,然后再逐步加工。如果你采用这种方式,那么从理论上说,你每天收工的时候都可以看到整体的效果,不会对最后的成品一点感觉都没有。跟你说实话吧,画家之间甚至流传着一句谚语:“画作永远没有完工的一天,你只是不再画下去而已。”这种情况对于第一线的程序员真是再熟悉不过了。

由此可见 “小步快跑” 并不只是单纯的 “在试错中迭代”,还有一个目的是为了鼓舞士气,特别是对那些需要创意、需要迎合市场需求快速变化以及落地周期较长的工作,更需要采用这种方法。

士气和 “心力” 这个概念相似,尽管现在很少听到人们谈论它,但它真实存在于我们日常的活动中。因为技术尝试跟业务或产品尝试一样,每一次尝试都在消耗企业的机会成本,一旦尝试失败,不仅对企业造成损失,还会耗尽相关同学的士气,使他们心力交瘁。特别是对于那些处于创新和成长阶段的企业来说,士气不足可能会让相关同学选择离开,进而加剧整个企业士气的下降。

我们身边的人,多少有一些属于下述情况:

  • 工作,以换取收入。他们可能并不是真的喜欢自己的工作,但出于经济上的需求,他们仍会选择继续从事这份工作
  • 在职业倦怠期中工作。在某些工作岗位上,由于长期重复性工作或缺乏晋升机会,他们可能会感到倦怠,虽然失去了对工作的热情,但仍然会继续工作以确保收入来源
  • 工作中缺乏成就感。一个人在自认为没有机会发挥创造力的岗位中工作,会逐渐失去对工作的热情,虽然他们还在履行职责,但对工作缺少兴趣

如果你是管理者,你需要识别出这些情况,士气是设计的关键因素,而 Coding is Designing,如果放任这么做,你其实是在杀公司,你也只是机械地执行任务,你不仅没有把公司带到离正确目标更近的地方,反而在间接地浪费着你周边人的士气和生命。有士气的人,才能做到上不负产品需求,下不负开发执行,又如习总书记的 “我将无我,不负人民”,无论身处什么职位、什么角色,首先应该一心为公。

什么是好的设计

“让设计更简单” 是稿定的愿景,站在用户的角度思考问题,把这个思维放大到极致,大概率是能做出好产品的。

那么当我们说 “好产品” 时是在说什么?我想大概是这五点:

  1. 功能完善。一个好产品能为用户提供符合预期的功能和特性
  2. 易用。好产品应该易于使用,用户能够快速上手,而无需经过复杂的培训或学习
  3. 优质体验 。除了功能之外,用户体验也是评价一个产品的重要指标,好产品应该能够提供出色的用户体验,包括界面友好、操作流畅、反应迅速等
  4. 高性能和可靠性 。好产品不仅要表现出良好的性能,还需要具有可靠性,能够长时间稳定运行而不出错
  5. 符合市场需求 。一个好产品需要满足市场的实际需求和趋势,能够解决用户在现实生活中的问题或提供实际帮助
  6. 良好的价值观 。除了满足功能需求之外,好产品还应符合用户的价值观需求,例如对环境友好、体现社会责任感等

而设计是确保产品或服务能够有效满足用户需求、提供良好体验并保持竞争力的关键过程。

那怎样才算是 “好的设计” 呢?只要开始思考这些问题,就会发现众多不同的学科对 “好” 的认识有着惊人的相似度,因为优秀设计的原则是许多学科的共同原则:

  1. 好的设计是简单的设计。在数学领域,简短的证明往往是更好的证明,当你被迫把东西做得很简单时,当你不能用表面的装饰交付时,你就被迫直接面对真正的问题,你就不得不做好真正的本质
  2. 好的设计是永不过时的设计。以永不过时作为目标能避免受到时代风潮的影响,“风潮” 这个词,从字面上就可以看出,它就像一阵风,随着时间变化经常改变,如果一件东西长盛不衰,那么它的吸引力一定来自本身的魅力,而不受风潮的影响
  3. 好的设计是解决问题的设计。许多不好的设计做得很辛苦,但是从一开始方向就错了,不要忘了问题本身也可以和答案一样不断改进,软件开发的难题通常可以被改成等价的较易解决的形式
  4. 好的设计是启发性的设计。论文有一个很有意思的指标,总体上可以把引用次数看作对他人启发性大小的粗略指标,如同软件开发,应该为用户提供一些基本模块,使他们可以随心所欲地自由组合,就像玩乐高积木那样
  5. 好的设计通常有点趣味性。幽默在一定程度上反映了力量,幽默感是强大的体现,始终拥有幽默感就代表你对厄运可以一笑了之,强大的标志就是可以轻松面对自己的人生。好的设计并非一定要有趣,但是很难想象无趣的设计会是好的设计
  6. 好的设计是艰苦的设计。困难的问题需要艰巨的付出才能解决,如同高难度的数学证明需要结构非常精细的解决方法(它们做起来往往也很有趣),软件开发也是如此,解决难题带来的痛苦是值得的,但我们需要的是咬牙向前冲刺的痛苦,而不是脚被钉子扎破的痛苦
  7. 好的设计是看似乎容易的设计。很多领域的算法和解决方案在形式上往往很简单,全让人觉得自己也能想到,可是真的那么简单?在大多数领域,看上去容易的事情,背后都需要大量的练习,你一定听过一万小时定律,练习的目的是把刻意为之的事情变成一种自觉的行为,当面对难题时,它将唤起本能,释放出直觉的力量
  8. 好的设计是对称的设计。对称是简洁的一种表现,世界上大量存在对称,这就说明了对称的重要性。短语、句子无不使用对称;美术、建筑、音乐无不使用对称;组件化、模块化无不使用对称;递归算法、甚至这个段落、这篇分享也使用了对称。但对称也有危险之处,在于它会取代思考,在大量使用重复元素的时候这种危险性更大
  9. 好的设计能支持再设计。很少有人能一次就把事情做对,更好的做法是先完成一个早期原型,然后提出修改,最好再把早期原型扔掉。困难的地方在于必须有本事看出什么地方还可以改进,应该培养对自己的不满,不必把犯错看成灾难,只要勇于承认、勇于改正即可,犯错误是很正常的事情。开源软件敢于公开承认自己有 bug,反而使得代码的 bug 比较少
  10. 好的设计常常是大胆的设计。好的设计还要有好的品味去识别出丑陋的东西,只有对这个领域非常熟悉,你才能发现哪些地方可以动手改进。只有在成为某个领域的专家之后,才会听到内心有个细微的声音说:“这样解决太糟糕了,一定有更好的选择。” 不要忽视这种声音,要培育它们,优秀产品的秘诀就是:非常严格的品味,再加上实现这种品味的能力

品味不是个人偏好,品味就是存在高下之分。

最好的文字来自不停的修改

早年从阮一峰的文章 Paul Graham:撼动硅谷的人(译文) 了解到 黑客与画家 这本书,但过去一直 “没有” 机会完整的读完,近几年的阅读量相比往年提高了许多,也是在这一时期读完了黑客与画家。

保罗·格雷厄姆身份是黑客、创业者、投资人,但在我看来更像是一个思想家。他有独特的财富观,而且鼓励创业,虽然在人类历史上,财富的名声曾经一直不太好,但在现代社会,要获取财富最佳的途径还是要靠自己创业。保罗·格雷厄姆在书中谈到了他的 “创业的方法论”:

眼下想必每个人都知道,过早优化(premature optimization)是一件危险的事情。我认为,我们应该对“过早设计”(premature design)也抱有同样的担忧,不要太早决定一个程序应该怎么做。

合适的工具能够帮助我们避免这种危险。一种好的编程语言,应该像油画颜料一样,能够使得我们很从容地改变想法。动态类型语言在这一点上就是赢家,因为你不必提前就设置好各种变量的数据类型。不过我认为,编程语言灵活性的关键还不在这里,而在于这种语言应该非常抽象。最容易修改的语言就是简短的语言。

“最好的文字来自不停的修改”,其实无论做什么 “产品”,都要追求可迭代这个原则,开公司、写代码、做设计也是一样,设计一样东西,最重要的一点就是要经常 “再设计”,编程尤其如此,再多的修改都不过分,走进死胡同和放进垃圾堆没有任何区别。

再到编程语言,Erik Engheim 在 This is just speculation 这篇文章中表达了和保罗·格雷厄姆类似的观点,语言是生产工具,但更重要的是,它是生产力工具,这意味着商业竞争的护城河已经延伸到了编程语言的选择上,当你选择比对手生产力更高的编程语言,你就比对手有更大的先发优势。既然可以使用任何语言,那就不得不思考到底使用哪一种语言,如果你所在的公司对这种选择的自由视而不见,而竞争对手看到了,那么你就有被击败的危险。

语言也能成为商业和技术的杠杆。

创新的源头

此前我对创新的定义是:做出别人完全没想到的东西,要牛逼,要与众不同,借鉴过的东西都不能称之为创新。这个定义真的太过狭隘,狭隘到让创新那么遥不可及,当我看过几本书后,对创新的产生过程又有了新的理解,其实产生创新时的最初想法就是那么幼稚、不科学,说出去都怕别人笑话,但是如果你自己相信它可以做到,并为之实践,或许它就真的可以做到。而且创新其实是可以被借鉴的,甚至创新就是从模仿开始,只要能改善现有的成功模式,只要能在某个点胜过别人就是创新。

保罗·格雷厄姆对此采用了乐观主义 + 怀疑倾向两种信念相结合的方式:

为了写出优秀软件,你必须同时具备两种互相冲突的信念。一方面,你要像初生牛犊一样,对自己的能力信心万丈;另一方面,你又要像历经沧桑的老人一样,对自己的能力抱着怀疑态度。在你的大脑中,有一个声音说 “千难万险只等闲”,还有一个声音却说 “早岁哪知世事艰”。

对解决难题的可能性保持乐观,同时对当前解法的合理性保持怀疑,当然了,扎实的基础、毅力、效率也是成功的必备因素,否则就只能是空中楼阁、纸上谈兵,有趣的是,另一本书的书名总结了这个观点:像外行一样思考,像专家一样实践

这一段我们聊一聊常见的误区。

创意不是来自于经验

我曾经认为一个好的产品经理应该是对产品定位很明确、对面向的用户群体很明确,对行业、市场不说十分明确,至少也要有自己的独到见解,此外对前端 App 来说,各平台的差异性、甚至 API 也要有所了解,为什么要了解 API?因为这基本决定了一个产品能做成什么样。不过现在我想这也不是必要条件,好比 iOS4 连导航栏都不能自定义,不照样出了像 Path 这样的 App。

创意可能会被经验束缚

工作中我一直认为自己是有产品观念的人,能提出建议并致力于改善体验,也希望团队的创新氛围能更加活跃,但偶尔也会自以为是,太相信自己的经验。几年前,曾经一起共事的一位 CEO 在做金融的一级市场,他想在客户的某个聊天群里插入一个机器人,专门抓取群里的消息,以便分析出这些客户对哪些东西感兴趣,我当时想了想后就说除非这群是自家开的,便否定了这种做法,那到底能不能实现呢?其实我内心觉得也是有可能的,当时想到了两种方案,不过因为市场上没有类似的做法,还有被屏蔽的可能,我就认为这是一个不合理的、脱离实际的、完全外行的想法,我以为我是拒绝了不合理的需求,其实我是否定了别人对于创新的尝试,却没有意识到自己的思维已经被经验所束缚住了。

酒香也怕巷子深

除了思维这个创意的起源外,技术是成功创意的保障,把自己培养成既有创意又有技术的人很难,不过很有必要,爱迪生发明电灯之前、张衡发明地动仪之前都是经过了孤身一人的长久研究,在没有人相信自己创意的时候,只好自己来证明。

创意 + 技术才是创新的保障,目的地明确了,就不要吝啬自己的投入:创意就像水龙头,技术就像水桶,如果没有水,水桶没什么意义;如果你思维敏捷,创意无限,桶太小,流出去的水也不是你的。

程序员和艺术家在解决问题和追求美的过程中有着共同之处,创新不仅是技术领域的需求,也是艺术领域的基石,成功创业则需要结合创造性思维和实践能力。

最后

《2001年宇宙之旅》的原作者曾写过三条很有趣的技术法则:

  1. 科学工作者申明某件事情可行的时候,基本上他不会错;但当他说不可能的时候,他很可能错了
  2. 发现极限的唯一方法就是超越极限,尝试向稍微超越这个极限的领域迈进、冒险
  3. 无论是哪种技术,只要它是非常先进的,那看起来都跟魔术没什么区别

只有应用 “新” 的创意和理论,才会诞生超越前人的最佳设计;只有解决那些难而正确的问题,才会诞生最佳研究。设计和研究最终都将通向同一个地方。