工作中的编程和学校里最大的不同在于:在完整的流程规范下,同事间协同开发,按时按量交付,并不断测试迭代优化,最终能稳定的用于生产。
有人说这是软件开发,并不是编程啊。对这就是工作编程和学校编程的差异,工作编程不仅仅考虑代码,代码是为系统服务的,而系统中千丝万缕的结构都与编程息息相关。
比如作为程序员,你需要搞定设计文档、流程图、伪代码、接口、测试用例,冒烟回归测试等等,以及与产品经理、UI工程师、测试工程师、数据工程师等进行配合。
所以你会注意到工作里的开发不仅仅是单纯地编程,它更像是修建一栋大楼,从规划、设计、审核、施工、装潢、再审核、交付等等,需要把设想中的建筑变成现实。
而学校里的编程更像是设计图纸搭局部模型,今天做个浴室、明天做个厕所,而且用料标准也不固定,没法形成建筑。
因为我是做数据分析的。拿数据平台开发来说,一方面有任务流程、数仓设计、命名设计、调度管理等事项,另一方面SQL开发也有很多规范。
从需求调研规划、规范定义、模型设计、自动化开发,到测试验证、数据资产管理等都需要注意。
对于SQL开发,不是传统认知的写代码run成功了事。它有编码规范、注释规范、DQL规范、DDL规范、运算符规范、表别名命名规范、调度配置规范、数据同步规范、std清洗规范、分区规范、维表使用规范等等要求。
这是在企业数据开发中需要严格遵守的,可能在学校里写个SQL并不会考虑这么多。
除了开发流程规范的差异外,编程本身也有很大不同,就是刚刚提到的代码规范。
学校里编程基本都是书本上或者老师教的步骤,一二三四实现了就可以,很难用到实际开发里。
现在各大互联网公司都有自己的代码规范和code review,比如腾讯、谷歌。
腾讯员工发过一篇code review,简单列几个:
- 对于代码格式规范,100%严格执行,严重容不得一点沙。
- 文件绝不能超过 800 行,超过,一定要思考怎么拆文件。工程思维,就在于拆文件的时候积累。
- 函数对决不能超过 80 行,超过,一定要思考怎么拆函数,思考函数分组,层次。工程思维,就在于拆文件的时候积累。
- 代码嵌套层次不能超过 4 层,超过了就得改。多想想能不能 early return。工程思维,就在于拆文件的时候积累。
谷歌开源项目风格指南,对各种语言大型开源项目都给出了代码规范:
拿Python来说,它分别对风格规范和语言规范做了详细说明。
对于Python异常处理,有如下建议,异常必须遵守特定条件:
-
优先合理的使用内置异常类.比如 ValueError 指示了一个程序错误, 比如在方法需要正数的情况下传递了一个负数错误.不要使用 assert 语句来验证公共API的参数值. assert 是用来保证内部正确性的,而不是用来强制纠正参数使用.若需要使用异常来指示某些意外情况,不要用 assert,用 raise 语句,
-
模块或包应该定义自己的特定域的异常基类, 这个基类应该从内建的Exception类继承. 模块的异常基类后缀应该叫做 Error.
-
永远不要使用 except: 语句来捕获所有异常, 也不要捕获 Exception 或者 StandardError , 除非你打算重新触发该异常, 或者你已经在当前线程的最外层(记得还是要打印一条错误消息). 在异常这方面, Python非常宽容, except: 真的会捕获包括Python语法错误在内的任何错误. 使用 except: 很容易隐藏真正的bug.
-
尽量减少try/except块中的代码量. try块的体积越大, 期望之外的异常就越容易被触发. 这种情况下, try/except块将隐藏真正的错误.
-
使用finally子句来执行那些无论try块中有没有异常都应该被执行的代码. 这对于清理资源常常很有用, 例如关闭文件.
其他具体请看:GitHub - google/styleguide: Style guides for Google-originated open-source projects
综上,学校是学习编程基础建立认知的地方,很难把所学用到工程开发里。而工作是教会你怎么用编程创造有价值的产品,这其中有太多东西需要你去学习、运用、深化。