Apr 04, 2018
个人观点,我觉得记住这些是有用的——当学习一门编程语言的时候,你实际上正在学四件事情。
- 怎么写代码:语法、语义以及资源管理
- 语言的范式:面向对象,函数式,逻辑等
- 产出物的生态圈:如何构建、运行可执行文件以及如何使用库
- 工具:编辑器,编译器,调试器,代码质量检测器(linter)
这四项很容易搞混,不幸的结果是,当你遇到问题最终完全找错了地方。
http://lambeta.com/2017/04/18/Techniques-for-Efficiently-Learning-Programming-Languages/
Nov 30, 2017
发现有一些错误是自己经常犯的,不记录下来回顾一下,总是会一直犯。高中的时候还有习惯来记录错题,然而这么好的习惯,到了大学里却莫名其妙的没有了,知道毕业两年后的今天才突然想起。所以第一个场贩的错误就是思想上的——学习是一件终身的事,要延续好习惯。
对于各种持有资源的连接池对象等,要时刻注意它们是否是线程安全的。
Python
更新变量的value的时候,变量名写错了,导致创建了一个没有用的新变量,老变量的value却没有更新
解决:
- 使用pylint 检查代码,会提示 unused variable;
- 在写代码的时候多用自动补全,而不要手动打出每一个变量。
Python 的变量声明和赋值没有分开,这个是一个坑,只能通过多用工具检查来实现
故障排查
dmesg -T
或 tail -200 /var/log/kern.log
查看系统kill进程的日志,可以看到被kill掉时候的内存占用,再用free -m 查看一下是否超出了内存 …
Aug 16, 2017
对编程产生感兴趣并因为乐趣而写程序。确信你自始至终都能乐在其中,这样你才愿意将十年光阴投入编程事业.
与其他程序员交流;阅读别人的代码。这比任何书任何培训都重要。
记住在 “计算机科学” 中包括”计算机” 这个词。要知道你的计算机执行一条指令需要多久,到内存中取一个字需要多久(缓存是否击中), 到磁盘读取连续的字需要多久,而磁盘的定位又需要多久.
Fred Brooks (人月神话作者) 在他的文章 没有银弹 中指出,发掘卓越软体设计者的三部曲:
- 尽早尽可能地以系统化的方式发掘最佳设计人员。
- 给有潜力者指派生涯规划师,并谨慎地规划他们的职业生涯。
- 提供机会给正在成长的程序员,让他们能相互影响,彼此激励。
Aug 05, 2017
指导思想
代码要做到自文档化
Python
- util模块使用util.py(单数形式),而不是utils.py,因为python标准库使用的是util
- 模块的命名:如果只有一个类,比如ItemProcessor,那么可以命名为item_processor.py,否则不能使用名词命名,使用描述性的短语『名词+动词』
django
- 使用 queryset 的时候尽量使用
.only()
,以减少对数据库的压力
devops
- using mosh is recommended over plain ssh
- using tmux is recommended over screen
- all directories/repositories should use underscore NOT hyphen
- 应该使用json schema来验证json是否合规
- 每一个调用方都应该使用token或者caller来表明自己的身份 …
May 30, 2017
转载自:https://mp.weixin.qq.com/s?__biz=MzIwMzg1ODcwMw==&mid=2247486399&idx=1&sn=219af64c7ecbf9e6c601cefddd0a0eba&source=41#wechat_redirect
众所周知,在团队中进行代码审查(Code Review)可以提升代码质量,分享项目知识、明确责任,最终达到构建更好的软件、更好的团队。如果你花几秒钟搜索代码审查的相关信息,你会看到许多关于代码审查带来的价值的文章。也有许多方法来进行代码审查:在GitHub中提pull request,或使用像JetBrains的Upsource之类的工具。然而即使拥有清晰的流程和正确的工具,还遗留了一个大问题需要解决——我们需要找寻哪些问题。
可能没有明确关于“我们需要找寻哪些问题”的文章,是因为有许多不同的要点需要考虑。正如任何其他的需求,各个团队对各个方面都有不同的优先级。
本文的目标是列出一些审查者可以找寻的要点,而各个方面的优先级就因各个团队而异了。
在我们继续之前,让我们考虑一下大家在代码审查时会讨论到的问题。对于代码的格式、样式和命名以及缺少测试这些问题是很常见的几点。如果你想拥有可持续的、可维护的代码 …
May 30, 2017
想象一个函数是一个流水线,每一个函数调用都是在当前函数旁边新开了一个流水线。
新的调用是从调用者分出的一条叉,所有的调用构成了一个从左向右的栈。
把每个循环想象成一个并行执行的流水线
把每一个 if/case 语句想象为一个流水线的一个分叉点,当然两条叉可能最后会聚合。
把一个类当做相关的动作和分享同一个状态的一个集合