乐趣区

关于书籍:让工具成为双手的延伸

求实的程序员,他们有哪些特质?

他们面临问题时,在解决方案中走漏出某种态度、格调、和理念。他们总是越过问题的外表,试着将问题放在更宽泛的大环境下综合思考。他们为所做的所有负责,责任感驱使着求实派的程序员,在软件的熵中,放弃我的项目的有序。

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 基金会的毕业我的项目,可能治理大量非结构化数据集,在新药发现、举荐零碎、聊天机器人等方面具备宽泛的利用。

退出移动版