这个问题后来我也经常拿来问面试的候选人,能考察的点比较全面。这里同时也分享一下如何解决问题或寻找答案的思路。
面对这个问题,简单来说,一段好的代码,必然是“对人友好”且“对机器友好”的。如果这个回答是毋庸置疑的,那么原问题就转化成了“什么代码对人友好?”和“什么代码对机器友好?”。
对人友好的代码,直观地说就是读起来很容易好理解、功能符合预期、维护起来简单、迭代的时候不复杂不需要大面积修改;对机器友好的代码是性能好、生产稳定不出意外、安全不容易被破坏。
最后原问题就转化为了:“一段代码如何让人读起来简单?”、“一段代码如何做功能能符合预期?”、“代码维护怎么更简单?”、“如何写高性能的代码?”等等子问题。
至此,从一个模糊的原问题,逐步就转化为了一个一个具体的子问题,解决好每一个子问题,原问题也就得到了解决。在算法里称为分治,在科学思维里叫结构化思维或大家熟悉的金字塔原理。90%的人没有结构化思维,面试回答问题的时候也是东一句西一句效果特别的差,尤其是自己觉得自己回答了十多条还以为自己回答的很好很满意,认知偏差太大了。
接下来的就比较容易了,针对这些诉求来做相应解决方案就可以啦。
具体一些关注的点:
-
对人友好
- 可读性:遵从编码规范、团队或项目一致;注释准确完备;代码结构分层清晰;
- 可维护性:架构合理、模块化、可复用性强;扩展性好、迭代影响尽可能的收敛,不过于扩散;有完整的文档;
- 功能完备:争取的实现目标;完备的单元测试:
- 简洁:不要秀复杂或难以直观理解的语法特性和语法糖;能简单的就不要复杂;能不增加额外技术环节或技术栈的就不要能加;
-
对机器友好
- 高性能:适合的算法和数据结构;充分利用硬件资源;减少不必要的循环或执行语句;快慢操作异步化;
- 鲁棒性:监控、告警;容错、容灾;完善的异常处理机制;自动化降级;
- 安全性:漏洞防护;数据保护;
- 规范性:不与团队或项目冲突的情况下尽可能遵从行业标准或建议,易于多环境兼容;
关注点有了,很多细节还需要进一步寻找答案,比如“如何进行模块化设计?”、“如何设置告警规则更好?”,具体的解决方法就不一一举例了,思维方式、思路和关注点都有了,寻找最后一点点答案吧。
#今日份十分钟#希望能对你的结构化思维、面试技巧和如何写一段好代码有一些启发。