给新手程序猿的16个必备小妙招


写在前面:

这个文章核心并不是程序优化的具体技巧,而是拿到一个问题如何思考和利用工具的通用方法。比如即使我们不知道 profiler 这个东西,通过搜索"代码 每一行 时间"也可以很快知道有这样的工具叫做 profiler,并且学会怎么使用。即使不知道 rand 这个函数怎么加速,通过搜索引擎也可以找到别人写好的现成代码。另一方面是发现瓶颈之后也不要着急自己修复,如果不是特别一目了然的话,先看看别人是怎么做的。站在巨人的肩膀上,事半功倍。



1.多看看「官方文档」


我们很多的问题和技术细节,其实,只要我们认真将官方文档过一遍,会发觉大部分的问题和认识模糊的地方都消失了。甚至,你还能发现自己之前通过搜索获得的到一些资料,可能是不准确或者已经过时的。官方文档是真正的好东西,因为编写文档的人群,通常就是这些技术或者软件的开发者,他们才是对这些东西最了解的人,因此,他们写的文档质量是很高的,通常也是最新的。


官方文档的不足的地方,大概是中文版本不多,看起来可能会比较吃力。不过,请相信我,下载一个翻译辅助软件,慢慢看还是可以的。另一方面,就是这些文档编写者,通常是技术界大牛,他们编写文档有时候是基于他们自己的技术认知水平,跳过了很多基础概念,也增加了阅读难度。不过,这个我们也可以通过多查资料,慢慢看来解决,并且通常会带来额外的学习收获。


2.比官方文档更重要的是源代码


看源代码

1)意味着你可以看到以及学习优秀的代码;

2)意味着即使源代码有坑,你也会提前在大脑有回路更容易找到问题所在。


看不懂源码意味着不同的几点:

1)你对这个库或者代码的功能不熟悉 (知道某段源码的功能及特点)

2)你不会用 Debug

3)你的算法基础薄弱 

4)源码太过混乱


你需要反思自己属于哪一项。针对其中某一类下药上来直接从头看源码学东西一般是不可行的。你需要从上层入侵到下层。先用这段代码才能看懂源码。而不是在上层都不熟悉的基础上开始。任何重复的代码/重复的类似代码。意味着你框架设计有问题,或者开发语言的表达能力不够。


Java 的固定设计模式就是 Java 本身表达能力不够的表现。流程意味着生命周期,即你不仅需要抽象已知的流程。还需要在未提及的点留下一个坑 (函数/接口/钩子)。往往这些坑在以后的需求变更和项目扩展和维护中是救命的点。日志非常重要,日志环境也非常重要,debug 是基础技能,对应的是开发状态。日志则对应稳定的线上状态。而不能重现的 bug 占整个开发的非常多的时间。所以错误日志记录详细的环境意味着你可以更快的重现这个错误。


3.提升 debug 的能力

从高层往底层找错

科学方法


很多新手遇到程序执行结果不对(尤其是图形程序员),先认为是机器毛病(浮点精度、硬件故障),然后认为是驱动有错,再认为是系统有错,最后才开始排查自己的程序。其实 99% 的情况下是自己程序有错,然后那 1% 里面的 99% 是系统有 bug,再接着那 1% 里的 99% 是驱动有 bug,最后到硬件问题,已经微乎其微了。


应该从高层往底层查,而不是反过来。debug 一般来说是知道现象,但原因未知。这一点和很多自然科学的情况一样,所以完全也可以用科学的方法来:提假说->根据假说做出预言->做实验肯定或否定预言。对应于 debug,那就是假设是某个地方有问题,那么推断它一定会导致除了你看到的现象之外的其他现象,运行程序看你的推断是否成立。掌握这个方法后 debug 不在变成瞎找瞎试,而是有迹可循有系统可依赖的方法。


4.重构是程序员的主力技能


好多设计模式不是提前就设计出来的,而是重构出来的。很多情况是我们在做设计的时候考虑不到的,是写代码时也考虑不到的,只有在项目上线后,客户使用过程中才会反应出来,这个时候就需要对项目进行扩展,版本升级,这时就体现老程序员实力的时候了,就是根据已有的情形,结合新的客户需求,使用合适的设计模式,使得代码能够优雅的扩展。


5.先用 profiler 调查,才有脸谈优化


如果做.net 代码的优化,也有对应的 Profiler 工具,这个可以帮我们快速的定位瓶颈在哪里。找到了瓶颈才有接下来的优化工作。


6.一行代码一个兵


这里说的一个关于函数的规范问题,有一种说法是一个函数的内容不应该超过 7 行,如果超过 7 行,那么肯定是把多个 Function 合并到一个函数中的,应该拆分成多个函数。这个要求可能有点高,很难做到。不过上百行,上千行的函数那是不应该的,必须拆分!


7. 最好的工具是纸笔,其次好的是 markdown


纸和笔只适用于在 Face 2 Face 的交流过程中,交流后顶多拍照留存,根本无法建立有效的知识库,以后想到之前的讨论,怎么检索?怎么修改?写 Wiki 才是王道,Markdown 只是一种写 Wiki 的方式罢了。


8.宁可多算一周,不可少估一天


程序员在估计工时的时候总是太乐观。随便开口就是一个小时就能搞定,半天就能做完。完全没有想到该修改对其他模块的影响。一个修改后的单元测试,可接受测试,UAT 环境测试,再到上线,很多地方都得花时间的。一旦某个测试不通过,然后又得调试,修改,再进行单元测试,可接受测试~~~~,好吧,谁能保证每次修改都是一次通过呢。


9.安装一个调试器(OllyDBG 或者 WinDBG),并设置为实时调试器


一但有程序崩溃就拦下来,除了可以抢救一些数据以外,还可以顺手分析下崩溃的原因,找找代码中的坏味道,反省下自己的代码中哪些设计可能会导致同样的问题。


10.编码不要畏惧变化,要拥抱变化


Embace Change 常被许多新手、XPers 和极端主义者当作老要不停改代码(code and fix)、重构的一个伟大借口——拥抱变化,其实真实原因是因为他们的经验不足,分析设计能力弱,预见、预构能力差,导致需求和代码不稳定。


11.注释是稍差的文档,更好的是清晰的命名,让代码讲自己的故事


结构清晰、可读性好的代码当然很重要。然而对于许多复杂系统软件,常常只有代码注释还不够,更好的文档其实是可视化的程序模型,其中包括各种清晰的命名。


12.在动手写代码前先通过循环不变式证明程序正确性


对待 Bug 绝不能想当然, 实际工程中, 当你修正 1 个 Bug, 很有可能会引起另一系列 Bug 的产生, 类比于雪崩效应. 再优秀的程序也会有 Bug, Bug 埋藏越久越是致命的, 这就是为什么要先证明正确性以减少潜在 Bug 的出现的可能, 同样地, 在编码-调试-编码的过程当中修正 Bug 很可能会导致新 Bug 产生, 致使开发效率急剧下降. 另外性能也算是 feature. 不达标也算是 Bug. 二八原则在性能上同样适用, 20% 的代码决定着程序的总体性能 (Profile 的时候要记住)。


13.尽量利用语言特性来保障代码可靠,避免让自己产生过大的心智负担


例如养成用 const 的习惯,养成多下断言的习惯。这个小 trick 可以让很多新手程序员快速摆脱「总感觉自己写的东西哪儿有问题」的感觉。


14.争取不写超过 40 行的程序,如果超过 20 行 准备把一些逻辑抽出来当函数


为何 20 行,为了一些 quick and dirty 的修改做准备;

这样 quick and dirty 之后同样,避免有很多 prop 的 class;

避免不了的话应该申请加工资相对于 forloop,用 index 做递归会稍微易读一些泛化是好的,只要泛化之后你写的测试不超过百行即可有时候,你发现相对于写库,不如写 boilerplate 和 snippets 方便 curry 一般只为了一件事情,就是为了调整参数次序,让 default par 在 一些没有 default value 的 par 前面;

其他时候主要为了填一些语言设计不好的坑。


15.提交代码之前 diff 回顾一下自己的所有修改


提交之前,用 diff 每一行修改都确认清楚是为什么要这样做,回想一下整个功能是怎么实现的、BUG 是怎么解决的。日子久了就会感觉到自己的每次提交越来越靠谱了,同时,版本库记录里面诸如「去掉一行注释」、「去掉一行调试代码」等等也就不会出现了。


16.避免踩坑


1)不符合 kpi 的需求不接,一个资深码农是懂得刷选需求的 ;

2) 一定要搞好监控和异常主动发现,监控不是那种让 sa 看看的花架子,资深码农懂得如何刷选监控中的有效信息并指导 bug 主动修复 ;

3)对上下游做到代码级别掌握,这样在甩锅上可以立于不败之地,再牛逼点的,可以做到指导上下游开发的方向,让上下游来配合自己完成开发目标 ;

4)搞好自动化测试和集成测试,很多老鸟的自动化测试写的非常有才,场景覆盖全,业务分析清晰,看一份牛逼的代码,推荐从集成测试和自动测试入手。


最后,再说几点

把觉得不靠谱的需求放到最后做,很可能到时候需求就变了~

如果担心坐太久,正确的做法是多!喝!水!

不要相信产品经理不改需求这种鬼话!

一定要写注释!!

用谷歌不用百度


来源:程序人生


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openkruise 缩容_Linus 本尊也来了!为什么 KubeCon 越来越火了?

原标题:Linus 本尊也来了!为什么 KubeCon 越来越火了?2015年11月,第一届 KubeCon 在美国旧金山开始的时候,还只是个200人的小会议,2019年的7月,KubeCon 第二次在中国举办,就有 3500 …

你可能不知道的C#语言特性

关键字 yield 通常用于迭代器中,向IEnumerable对象提供值或者结束迭代。 如: yield return expression; yield break; var 用于定义隐式类型的变量。 var i 5; var s "Hello"; 注意隐式类型(Implicitly typed)并不是…

c语言中文件如何插入数据,急求如何将下列C语言程序数据存储到文件中?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼求如何改动才能将下列程序的存储输入或输出数据(或两者一起)到指定的文件(或运行时直接创立一个文件)如Arrangement中。#include int n0;int rest[7][7]; //全局声明,以供全局调用int main(){void perm(int list[],int ,int );int …

python字符串设置字体_python怎么更改字符串后几位

python更改字符串后几位的方法:可以利用replace()函数来实现。replace()函数可以把字符串中的旧字符串替换成新字符串,并返回替换后的新字符串。具体使用方法如:【str.replace("is", "was")】。可以利用replace()函数来修…

使用 Tye 辅助开发 k8s 应用竟如此简单(二)

续上篇,这篇我们来进一步探索 Tye 更多的使用方法。本篇我们来了解一下如何在 Tye 中使用服务发现。服务发现 - 微服务开发不可缺少的部件 服务发现,就是新注册的这个服务模块能够及时的被其他调用者发现。不管是服务新增和服务删减都能实现自动发现。《…

程序猿的双十一最佳攻略

讲个恐怖故事 一年一度虐汪“光棍节”又来了 小天拍拍(不存在的)胸脯告诉大家 这个节日 我陪你们 买买买! 限时特惠专场 1 welcome 7天教你学会数学建模及Matlab编程 数学建模涉及的内容比较广泛,比如碎纸片问题中所涉及的图像识…

傅里叶变换音频可视化_HTML5如何实现音频可视化频谱跳动

本篇教程探讨了HTML5如何实现音频可视化频谱跳动&#xff0c;希望阅读本篇文章以后大家有所收获&#xff0c;帮助大家HTML5CSS3从入门到精通 。<html>HTML5音频可视化频谱跳动代码* {margin: 0;padding: 0;}#canvas {display: block;background: linear-gradient(135deg,…

android websocket封装,Android WebSocket 方案选型OkHttp

目前Android WebSocket 框架 主要包括:SocketIOJava-WebSocketOkHttp WebSocket一开始我首选的是采用SocketIO方案&#xff0c;因为考虑该方案封装接口好&#xff0c;提供异步回调机制&#xff0c;但和后端同事沟通发现目前客户端的SocketIO不支持ws wss协议, 所以无奈只能放弃…

关于Word中审阅的一个问题!

前两天&#xff0c;在帮一个杂志撰稿的过程中&#xff0c;有一个关于Word审阅的问题。&#xff08;以下内容以Word2007为例&#xff09; 本身&#xff0c;审阅的应用不算困难。 我们可以为文章添加“批注”&#xff0c;或是你的上级对文章进行修改&#xff0c;他们可以开启“审…

ASP.NET Core - 在ActionFilter中使用依赖注入

上次ActionFilter引发的一个EF异常,本质上是对Core版本的ActionFilter的知识掌握不够牢固造成的&#xff0c;所以花了点时间仔细阅读了微软的官方文档。发现除了IActionFilter、IAsyncActionFilter的问题&#xff0c;还有一个就是依赖注入在ActionFilter上的使用也是需要注意的…

魏尔斯特拉斯函数与分形图形的动画演示

一般人会直觉上认为连续的函数必然是近乎可导的。即使不可导&#xff0c;所谓不可导的点也必然只占整体的一小部分。根据魏尔斯特拉斯在他的论文中所描述&#xff0c;早期的许多数学家&#xff0c;包括高斯&#xff0c;都曾经假定连续函数不可导的部分是有限或可数的。这可能是…

大脚战场插件怎么关闭_PM工具栏插件:HonmToolBar

视频演示&#xff1a;问&#xff1a;HonmToolBar是一款什么样的插件&#xff1f;答&#xff1a;HonmToolBar是一款高度自由化的插件&#xff0c;用户可以自己增加宏文件按钮或者宏命令按钮。该插件类似工具栏&#xff0c;有水平和垂直两个工具栏。插件悬浮在PM图形窗口左上角&a…

android 导航 美国,变美了 Android N或用全新虚拟导航按键

原标题&#xff1a;变美了 Android N或用全新虚拟导航按键变美了 Android N或用全新虚拟导航按键【IT168 资讯】虽然距离谷歌Android N系统的发布已经有一段时间了&#xff0c;不过该系统目前仍旧属于内测阶段&#xff0c;短时间内仍难以迅速推广。另外也正是由于Android N正式…

唐骏的商业模式

唐骏曾把商业模式比作谈恋爱&#xff0c;其要抓住三个要点&#xff1a; 1、简单&#xff1a; 太多的环节很难让人接受&#xff0c;并且容易潜藏缺陷&#xff0c;一目了然最好不过&#xff01; 2、有创意&#xff1a; 一定要有自己独特的创意&#xff0c;一位跟随别人&#xff0…

python特性和属性_Python面向对象-类的特性及公私有属性 | 【韩涛博客】

构造函数 __init__ self.name name #属性&#xff0c;成员变量&#xff0c;字段 def sayhi() #方法&#xff0c;动态属性 公有属性 在类中直接定义的属性&#xff0c;大家都可以用 私有属性 __两个下划线定义&#xff0c;外部不可以访问&#xff0c;内部可以访问 class Role(o…

[Abp 源码分析]自动审计记录

点击上方蓝字关注我们0.简介Abp 框架为我们自带了审计日志功能&#xff0c;审计日志可以方便地查看每次请求接口所耗的时间&#xff0c;能够帮助我们快速定位到某些性能有问题的接口。除此之外&#xff0c;审计日志信息还包含有每次调用接口时客户端请求的参数信息&#xff0c;…

我的老公是枚码农

前两天看到一篇写程序员的爆文&#xff0c;虽然略显夸张&#xff0c;但也着实有趣。忽然想到身边人也是一枚码农&#xff0c;浑身上下也是浓厚的码农气息&#xff0c;遂也胡乱写了几笔&#xff0c;博君一笑&#xff0c;为了方便起见&#xff0c;就称其为“码农哥”。 1 码农哥还…

如何修复硬盘坏道?

首先需要先确认硬盘的坏道是逻辑坏道还是物理坏道。 方法很简单&#xff0c;在电脑刚启动时按“F8”键&#xff0c;选择“Command Prompt only”进入DOS模式。这种方法的操作系统必须为Windows95/98&#xff0c;若为Windows2000/XP/2003&#xff0c;请使用DOS启动盘启动。然后执…

c++11 string u8_深入理解C++11:C++11新

一.数据对齐在了解为什么数据需要对齐之前&#xff0c;我们可以回顾一下打印结构体的大小这个C/C中的经典案例。先看代码&#xff1a;#include using namespace std;struct HowManyBytes{char a;int b;};int main(){cout<>endl;cout<>endl;cout<>endl;cout&l…

harmonyos con,鸿蒙HarmonyOS系统中的JS开发框架

HarmonyOS开源至今已经一个多月&#xff0c;源码托管在国内知名开源平台码云上&#xff0c;https://gitee.com/openharmony 。我最感兴趣的就是JS 框架 ace_lite_jsfwk&#xff0c;从名字中可以看出来这是一个非常轻量级的框架&#xff0c;官方介绍说是“轻量级 JS 核心开发框架…