求实的程序员,他们有哪些特质?
他们面临问题时,在解决方案中走漏出某种态度、格调、和理念。他们总是越过问题的外表,试着将问题放在更宽泛的大环境下综合思考。他们为所做的所有负责,责任感驱使着求实派的程序员,在软件的熵中,放弃我的项目的有序。
Thomas 与 Hunt 从 1999 年开始,通过这本颇具影响力的大作,帮忙有数客户发明出更好的软件。这本书是技术书籍中的一件「珍品」,须要经久不息一读再读。无论你是老手还是经验丰富的程序员,你都能从这本书中发现乐趣。
通过这本书,你能够学会:
- 求实的哲学与求实的办法
- 防止常识反复的陷阱、灵便驾驭根本工具
- 防备安全漏洞、组建求实的入门套件
- 写出有弹性、动静、适配性强的代码
- 有情而无效地做测试
工欲善其事
你能够在 Shell 中启动应用程序、浏览器、编辑器,还能够搜寻文件、查问零碎状态,并将后果过滤后输入;你能够通过各种形式组合工具——可能连开发者本人都想不到本人当初开发的工具会被这样应用;你还能够通过对 Shell 编程构建出简单宏指令,来自动化日常工作。
有人要问了,在图形界面和集成开发环境(IDE)中,通过点击屏幕也能够实现以上每件事件,而且看上去更加直观,不是吗?
是,也不是。图形界面的益处是「所见即所得」。像是拖拽文件、发送电子邮件、输出信息等这些工作,你齐全能够应用图形界面实现。然而,齐全应用图形界面,你会错失环境的局部能力——你将无奈把常见的工作自动化、无奈通过组合工具来定制宏工具。图形界面的局限是,「所见即全副」,如果你想要超出设计者给定的性能,就会碰壁。
在《程序员修炼之道》的「根底工具」一章中,作者激励你应用 Shell、增强应用编辑器的能力。怎么才算熟能生巧地应用编辑器?作者给出了一个挑战清单,试试看你能是否不应用鼠标和触控板实现下面所有工作?
- 当编辑文本时,以字符、单词、行、段落为单位挪动光标及进行抉择
- 当编辑代码时,在各种语法单元(配对的分隔符、函数、模块……)之间挪动
- 做完批改后,从新缩进代码
- 用单个指令实现代码块的正文或者勾销正文
- Undo 并 Redo 变更
- 把编辑窗口切割成多个面板,而后在它们之间跳转
- 跳转到特定的行号
- ……
–
相熟 Shell 之后,你会发现生产率大幅度提高,某一天你会诧异地发现,本人十指翻飞,这些工具已成为不假思索的肌肉记忆、这些工具将成为双手的延长。
优良设计的精华
想要牢靠地开发软件,让开发我的项目更容易了解和保护,须要遵循的准则是:在一个零碎中,每一处常识都必须繁多、明确、权威地表白。让咱们来看一个典型的例子:
def print_balance(account)
printf "Debits: %10.2f\n", account.debits
printf "Credits: %10.2f\n", account.credits
if account.fees < 0
printf "Fees: %10.2f-\n", -account.fees
else
printf "Fees: %10.2f\n", account.credits
end
printf "———-\n"
if account.balance < 0
printf "Balance: %10.2f-\n", -account.balance
else
printf "Balance: %10.2f\n", account.balance
end
end
先不说不应该用浮点数保留货币金额,这段代码中至多有三处反复。
首先,对于正数解决的中央有一处显著的复制粘贴。通过减少一个判断正负的函数就能够打消这个反复。
其另一个反复是 printf
的调用中,雷同字段的格局重复呈现。咱们诚然能够减少一个常量,把这个常量传给每次的调用,但为什么不间接应用曾经定义的函数?解决下面两个反复问题,代码当初长这样:
def format_amount(value)
result = sprintf("%10.2f", value.abs)
if value < 0
result + "-"
else
result + " "
end
end
def print_balance(account)
printf "Debits: %s\n", format_amount(account.debits)
printf "Credits: %s\n", format_amount(account.credits)
printf "Fees: %s\n", format_amount(account.fees)
printf "———-\n"
printf "Balance: %s\n", format_amount(account.balance)
end
如果客户要求在后面的标签和前面的金额之间多加一个空格,该怎么办?让咱们持续优化这段代码:
def format_amount(value)
result = sprintf("%10.2f", value.abs)
if value < 0
result + "-"
else
result + " "
end
end
def print_line(label, value)
printf "%-9s%s\n", label, value
end
def report_line(label, amount)
print_line(label + ":", format_amount(amount))
end
def print_balance(account)
report_line("Debits", account.debits)
report_line("Credits", account.credits)
report_line("Fees", account.fees)
print_line("","———-")
report_line("Balance", account.balance)
end
如果咱们须要变更金额的格局,就去批改 format_amount,如果想要变更标签的格局,就去批改 report_line。当初的这段代码相比第一段,更加易于测试和扩大。
程序员要致力的方向,应该是孕育出一个容易复用已有事物的环境,而不是反复常识。
在作品上签名
如果你打算跟他人解释你为什么做不完、为什么延期、为什么搞砸,在此之前先等等,听一下本人的心田。讲给你显示器上的橡皮鸭听听,或是先对着猫说一遍。你的那些借口听起来正当吗?还是很愚昧?你的老板听到会怎么?
求实的程序员应该提供抉择、解决问题,而不是找借口。不要说搞不定;解释一下要做什么能力挽回这个场面。是否必须扔掉这些代码呢?和团队探讨下重构的价值吧?你是否须要一点工夫来做原型?为了避免谬误再次发生,你是否须要清理你的代码、引入更好的测试?
作者在书的最初一章指出,如果程序员的代码都是匿名的,可能会滋生大意和谬误,特地是在大型项目中,程序员未免把本人看成是大齿轮上的一个小齿;如果程序员都在作品上签名,又有可能导致单干的问题。求实的程序员不会逃避责任,相同,咱们乐于承受挑战,并为本人的工作感到骄傲——「这是我写的,我与我的作品同在」,你的签名被认为是品质的标记。当人们在代码上看到你的名字,该当对这份牢靠的、通过测试的、业余的工作充斥期许。
积攒代码量很重要,
读书、读好书也很重要。
「Zilliz 好书举荐」栏目,
旨在与你分享技术成长相干的书籍,
与你一起先把书读厚,再把书读薄。
——————————————————————————
Zilliz 以从新定义数据迷信为愿景,致力于打造一家寰球当先的开源技术创新公司,并通过开源和云原生解决方案为企业解锁非结构化数据的暗藏价值。
Zilliz 构建了 Milvus 向量数据库,以放慢下一代数据平台的倒退。Milvus 数据库是 LF AI & Data 基金会的毕业我的项目,可能治理大量非结构化数据集,在新药发现、举荐零碎、聊天机器人等方面具备宽泛的利用。