编程与数据科学的经验之谈

Posted by 一轩明月 on June 21, 2020

编译自:40 Tips that will change your coding skills forever,Kesk -*-

『2021-04-15 更新』:21 Tips for Every Data Scientist,Terence Shin

本文是对一些一线编程实践者们多年工作中感到大有裨益的内容的清单体总结,读起来很快,但想要用好可能要花费一生。有些人开发程序十几年,仍要不时停下来想想这行当里的核心部分。

编程

  1. 拿到代码,将大段代码分解成若干小功能
    • 除非方法只有一行,或只被同一个类里的一个方法调用。这样的过度抽象会使代码逻辑跳转太频繁
    • 单元测试要覆盖方法内的所有分支
    • 相同代码块重复写过 3 次,就该抽成独立方法
  2. 如果下班时候还没有解决掉问题,关掉电脑将它留给明天。别再考虑了
  3. YAGNI 原则:除了明确要求的,别多做闲事。别总预期未来,尽快把能用的东西做出来。只对解决当下问题至关重要的部分进行编程。
  4. 你不需要知道所有事,也不需要知道所有现有框架,最重要是的基础扎实。开始使用框架前深度研习一下语言,并掌握些基础内容,像 SOLID 原则或是怎么写出干净的代码。
  5. KISS 原则:“Keep it simple, stupid”,或者 “Keep it stupid simple”,简洁的像傻瓜是一种设计原则,讲的是绝大多数系统保持简洁而非复杂才效果最好。虽然这合乎逻辑,有时却难以实现
  6. 可能是想多了
  7. 如果被难题或 bug 纠缠太久,离开,过会再回来。问题的最佳解决方案可能出现在办公室到卫生间的路上。当你对客户或是同事感到愤怒的时候,一走了之同样可取,尤其是你还想继续干的时候
  8. 学会写有用的测试,学习实践 TDD。TDD 是一种软件开发流程,其不断重复着简单的开发循环:写测试,执行所有测试并看看新测试是否失败,写代码,跑测试,重构代码,重复
  9. 先解决问题后写代码。不要连要做什么都不知道就开始写代码
    • 有时问题怎么解只有做了才知道,做着做着问题就没了,但这不该是目标不清,目的不明的借口
  10. 别记代码,要懂逻辑
  11. 如果从 stack overflow 复制粘贴解决方案,确保自己理解了,善用 Stack Overflow
    • 注释块里加上启发你的 Stack Overflow 链接 URL
  12. 想学什么就去实践。做点样品并保证出品效果,光是阅读是不够的
  13. 不时看看别人的代码,也让别人看看你的代码。结对编程和代码审计是很棒的想法。
  14. 别重复造轮子
  15. 你的代码就是最好的说明文档
    • 注释块比同行注释强
    • 注释是讲代码故事,增加背景信息,不是重人工翻译一遍代码已经说了的事
  16. 了解怎么搜索东西。为此,不仅要有经验还要大量阅读知道要去找什么
  17. 你的代码将来都要由你或他人进行维护的,所以写的时候心里要有读者,别总想当最聪明的人。让阅读代码像读故事般舒适。
  18. 用 google 解决问题最好的方式就是复制粘帖问题到搜索框
  19. 别放弃,最后总会通过某种方式解决它。或许会有阴云笼罩的日子,但那终会过去
  20. 休息,休息还是休息。解决问题的最佳方式是有一颗精力充沛,神清气爽的大脑
  21. 学习使用软件设计模式。设计模式是人们针对软件设计中的常见问题总结出的解决方案。每个模式都像是张蓝图,你可以定制化地解决自己编程中的一般设计问题(不重复造轮子)
  22. 使用集成工具,并尽你所能地自动化
  23. 做 code kata。Kata 是种编程练习,能帮助程序员通过实践和重复磨练技能。参考这里
  24. 程序要写成接口,而不是实现。依赖注入是项要求,见 SOLID 原则。
  25. 重构-测试-重构。重构是门调整重组既有代码,不改变外在表现的情况下变更改进内部结构的技术。
  26. 有需要就去求助。别浪费时间
  27. 熟能生巧
  28. 尽管有时注释会帮到你,但别太在意,大概率都过时了
  29. 了解你的开发环境,买个功能强大的,比如 IntelliJ
  30. 复用组件
  31. 开发 web 应用的时候,先考虑移动端,相关权限以及带宽限制。
  32. 不要过早地优化或是重构。更重要的是尽可能拿出最小可行性产品
  33. 永远不要走低效捷径只为节省几分钟时间。每次敲代码都要全力以赴
  34. 遵循文件化标准
  35. 用户没有技术背景,开发 UI 的时候记得这点
  36. 坚持使用 GitHubbitbucket 这样的源码控制系统,git 提交要小而频
  37. 记日志必代码调试强。所有关键部分都要记录日志
  38. 编码始终如一。如果你有某种风格,保持它不要变。如果是和他人合作,整个团队的格式要统一
  39. 坚持学习,但不仅是新语言或框架,更要专注于软件开发的基础上
  40. 永远对所做的事保有耐心和热忱

数据科学

  1. 解决方案越简单越好。不存在一个模型包打天下,能用线性回归就别用 N 层神经网络
  2. 有意识地定期浏览、尝试新的库和包。身为智人,别那么容易满足
  3. 追求效率并不意味着潦草应付重要步骤。成事靠系统,可借鉴 CRISP-DM
  4. 指标合理比模型本身更重要。评估指标和要克服的挑战必须具备对应关系
  5. 工作成效和你的阐述能力成正比。要做到不用行业黑话和技术语言让他人理解你所做的工作
  6. 掌握基础,特别是统计。学习现代统计和数学,实践得有理论基础
  7. 理解当下待解问题的参数。参数在业务需求、模型使用场景中扮演什么角色
  8. 不要低估 SQL。除了建管道和获取数据,你甚至可以用 SQL 建机器学习模型
  9. 数据科学是团队游戏。这一行自由度虽高,但绝不是你不寻求建议、帮助和他人反馈(股东、用户、业内专家和数据工程师等)的理由。
  10. 你不需要记住一切。学会用搜索,建立速查表和资料库
  11. 快速开发,快速迭代,持续获取反馈。持续沟通,让他人时刻处在你的『思考——模型假设——验证反馈』的循环中。可以每次迭代时用 Gradio 搭建交互式 web UI,给老板和没有编程经验的人展示。
  12. 对项目要有全局视角。当甩手掌柜的日子一去不复返了,产品经理和开发工程师的角色一个不能少
  13. 一切都是营销。数据科学家时刻都在兜售自己,无论是想法还是模型,必须能说清你的每个想法、模型和承接项目背后的商业价值。
  14. 终身学习。有计划的持续学习并付诸实践
  15. 版本控制。起码会用 Git 和 Github 吧
  16. 干中学。课题型、研究式地学习最有效
  17. 跟紧前沿。论文、大公司博客、YouTube 视频等等
  18. 发散和收敛思维。发散寻找多种可能,在收敛到一个方案上,EDA 和选算法时很有用
  19. 建立事业档案。区别于简历,这是为了自己回顾和反思用的,参考这里
  20. 学会管理预期。减少承诺,超额回报,他人对模型效果和时间线的期望管理尤其重要
  21. 找个愿意帮你的导师。跟人学是最快、最高效的捷径