0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

《代码的艺术》观后感

芯片验证日记 来源:芯片验证日记 作者:芯片验证日记 2023-01-28 21:51 次阅读

前段时间听了百度技术培训中心章淼博士讲的《代码的艺术》直播课,章老师是业界大牛,课讲得娓娓道来,内容很丰富,很多点都戳到了我以前或现在的痛点,也激发了自己很多反思,总之收获很多,现在简单总结一下,主要分以下几点吧。

1.文档:

关于文档,很多工程师最讨厌两点:没有文档和自己写文档。我以前对文档也有很深的误解,比如经常觉得写文档有点儿浪费时间,总觉得码代码和Debug才更能显示出一名工程师的能力和价值。这其实是一个严重的错误。文档的重要性被严重低估了。

1.1 项目文档的重要性

(1) 文档的目的:提高沟通效率;提升对“思考过程”的管理。(2) 项目中超过50%的时间用于沟通,沟通的方式:口头,文档,代码。(3) 没有文档的设计不是设计。(4) 不会写文档 = 不会做设计。(5) 文档本身也是产出:coding的时间少于30%。(6) 写文档是整理思路的过程。(7) 没有文档,后期会浪费更多的时间,维护成本远高于写文档的时间。

(8) 修改文档,比修改代码的成本小的多。

(9) 没写文档,就开始写code,是极其错误的。

(10)简单的项目和问题,也需要写文档:项目的延续时间和复杂性往往超出预期;早期的“偷懒”,往往在后期付出更大的代价。

1.2 常见的问题:

(1) 没有接口文档:多人协作出现问题。(2) 需求文档没写好:多次反复讨论同样的问题。(3) 没有系统总体架构文档:每一个人都需要重新看代码,还不一定能看清。(4) 缺少文档:新人无从入手;人员变动时,不好交接;团队内沟通效率很低;自己过两个月后,痛苦的回忆之前的思路。

1.3 什么时候需要写文档?

(1) 必须的文档:需求设计文档:需求,重点,取舍过程;接口文档:函数,参数,返回值;关键性的算法文档:思路,关键点;系统总体框架:全局的思路。(2) 凡是不那么“显而易见”的地方。(3) 不仅留下设计结果(what),也留下思考过程(why):留下决策的依据,便于后面的工作。(4) 文档不是写完代码后补出来的:文档是设计过程中使用的工具、和设计过程的结果。

1.4 文档书写规范

关于书写规范,每家公司的要求都不太一样,大家遵守就好。国内芯片行业在文档这方面做的最好的应该就是海思了,我个人觉得海思芯片的成功,跟他的文档和管理密不可分。

2. 项目管理

项目管理是另一个被忽视的重要的问题。引用《软件开发的201个原则》中的一句话,所有伟大的技术(CASE工具、技术、计算机、文字处理器等)都弥补不了拙劣的管理。好的管理,即使是在资源匮乏的情况下,也能产生巨大的效果。事实上,懂项目管理的工程师特别少。每一位工程师其实都是管理者(做好自己的管理),所有的工程师都应该懂项目管理。

2.1 原则:质量第一

质量必须放在首位,没有权衡的余地。无论如何定义质量,客户都不会容忍低质量的产品。质量必须量化,并建立可实施落地的机制,以促进和激励质量目标的达成。即使质量差、也按时交付产品,这似乎是政治正确的行为,但这是短视的。从中长期来看,这样做是自杀。

2.2 项目三要素的权衡

锁定1-2个要素,改变其他要素。人和月不能简单互换。

pYYBAGPVJ1eAcIbGAADD5R7Embs069.png

2.3 项目规划

(1) 明确项目约束(质量、范围、时间、成本),做出取舍。(2) 制定项目里程碑计划,和相关方达成一致。(3) 分配任务并制定进度表:梳理关键任务;搞清关键任务间的依赖关系;识别项目的关键路径。

2.4 项目周报和个人周报

(1) 做好下周计划,抓住重点。(2) 每周对照计划,即使有变化,也应努力按计划执行。(3) 反映工作量,周报首先是给自己看的。(4) 周报需要目标和计划,也需要回顾和总结。

3. 代码的艺术

代码反映了一个人/团队的精神面貌。一个优秀的工程师应该具有很高的综合素质。编码能力只是表象,不仅要懂验证,还要懂脚本,懂运维,懂设计、懂架构,懂产品。真正优秀的工程师任何时候都是稀缺的。

3.1 Coding is NOT so easy

(1) Coding的过程是:从无序变为有序;将现实世界中的问题转化为数字世界的模型;一个认识的过程(从未知变为已知)。(2) Coding的过程中,需要把握问题的能力;建立模型的能力;沟通协作的能力;编码执行的能力。(3) 写好代码首先需要建立品味

3.2 一流代码的特性

poYBAGPVJ4yAPHb8AAK7c__v_Ag275.png

3.3 代码也是一种表达方式

代码主要是写给人看的,不是写给机器看的,代码的维护成本远高于开发成本。理想的场景:看别人的代码感觉和看自己的代码一样;看代码时能够专注于逻辑,而不是格式方面;Don’t make me think。

3.4 模块切分的原则

紧内聚,松耦合,有利于代码的复用:单一目的;明确对外接口;以数据为中心。

3.5 切分模块的方法

(1) 数据类模块(实现对数据的封装)。(2) 过程类模块(不包含数据)。

3.6 数据类模块

(1) 主要完成数据封装:模块内部变量;类的内部变量。(2) 对外提供明确的数据访问接口:数据结构和算法属于模块内部工作。(3) 写程序要以数据为中心考虑:首先考虑有哪些数据类的模块。

3.7过程类模块

(1) 本身不含数据。(2) 调用“数据类模块”或“过程类模块”。

4. 代码的评审(Code Review)

定义:通过阅读代码来检查源代码与编码标准的符合性以及代码质量的活动。在编写代码之外,代码评审和单元测试是两个最重要的工作。

4.1 代码评审的重要意义

(1) 提升代码质量:code review是提升代码质量最重要的方法。(2) 有助于知识传递:code review是辅导他人编码最好的方法。

4.2 代码质量差造成的问题

(1) 重复编写类似的逻辑,缺少可复用的代码。(2) 定位bug和修复bug。(3) 代码的可读性差,阅读代码困难,费时。(4) 踩坑/填坑,挖坑容易,从坑里爬出来难。(5) 重构也需要时间。(6) 无休止的加班的源泉。(7) 职业危机,生存困境。

4.3 代码评审中的常见问题

(1) 拼写错误。(2) 未优化的代码实现。(3) 不必要的复杂代码。(4) 重复实现已经存在的逻辑。

(5) 缺少必要的注释。

(6) 缺少必要的单元测试。

(7) 。。。。。

4.4 在代码评审中应有的态度

(1) 对所审代码完全看懂:yes:掌握情况就像自己写的一样;no: 对代码逻辑和背后的原因任很模糊。(2) 不仅可以运行:优秀代码的标准:正确,可维护,可重用,可运维。google的标准:差一个空格也不行。(3) 评审和编码一样重要:评审也有产出:更高质量的代码;评审比编码更辛苦:理解&找出问题。(4) 以提升代码质量为最终目标:评审双方共同努力。

4.5 代码评审的步骤

(1) 推荐方式:自顶向下,对代码进行全面扫描。(2) step1:系统全貌:模块划分的逻辑,模块间的关系。(3) step2:模块级别:看清模块内的逻辑;关键数据,关键的类/函数(重点:功能,接口定义)。(4) step3:类/函数的内部逻辑:逻辑正确性,实现合理性,段落划分合理性。

4.6 关于坏代码的简单判断

(1) 如果5分钟内不能看懂的代码,大概率有问题。(2) 需要思考才能看懂的代码:好的代码:Don’t make me think。(3) 需要来回翻屏才能看懂得代码:好的代码:在一屏内就是完整的逻辑。(4) 没有空行/注释的代码:不会用段落,不会写注释,肯定不是好的程序员

4.7 代码评审的注意事项

(1) 建立ower制度:所有提交的代码,必须由ower做最终确认;很多问题来源于“责任不明确”。(2) 综合多种沟通机制:yes:面对面的沟通;提供设计文档;提交代码评审评论;no: 直接大规模评审会;仅口头沟通。(3) 不放过任何一行代码:问题:只看大问题,不管小问题;推荐:对评审中发现的问题,一追到底。

5 技术的心法

5.1 如何发现问题

(1) 问题的发现常常需要经验,尤其是方向的指出。(2) 写综述(survey),是一个很好的锻炼方法。(3) 从自己的亲身体会去发现问题。

(4) 要有挑战权威的精神,别人说的不一定是对的。

(5) 一定不要有“想当然”的思想,书本上的不一定是正确的。

(6) 没有任何事情是完美的,实际工程中经常做“trade off”。

5.2 如何分析问题

(1) 概念(砖块):问题首先要有准确定义(正名);概念是大家的共识,是进行科学交流的基础;在搞清概念的过程中,也能发现机会。(2) 逻辑(水泥):分析问题应言之有理,让人信服。(3) 分而治之:大问题(无从下手)=>小问题(能够处理);细分和专业化是人类社会发展的趋势。(4) 分类和比较:在过程中加深认识。(5) 注意联系:问题之间的联系也包含信息;揭示事物之间的联系也很有意义。

5.3 如何解决问题

(1) 先解决重要问题:精力有限:不可能彻底解决所有问题;列出问题,然后再排序。(2) 保持聚焦:在一定的阶段,要keep focus。(3) 先易后难:解决简单问题=>解决复杂问题;模型方法:对问题进行简化

(4) 一般的过程:发现问题,分析问题,解决问题。

一流高手提问题,二流高手解问题,三流高手炒问题(炒冷饭)最后的最后,好好学习,天天向上,行胜于言,与君共勉。

感谢关注微信公众号“芯片验证日记”,我们一起学习。

审核编辑黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6514

    浏览量

    87610
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66819
收藏 人收藏

    评论

    相关推荐

    【换道赛车:新能源汽车的中国道路 | 阅读体验】 A 序

    怎样的影响? 国内外汽车企业的发展历程和经验教训带给我们怎样的思考? 我国新能源汽车为什么能够实现突破从而领先世界? 我国新能源汽车产业未来提升的最大瓶颈和障碍是什么? 希望这样的探讨对读者有所启发。 接下来将用2篇观后感来分别解答这几个问题,以及最后一篇整体观感。
    发表于 03-12 23:05

    简于形精于器智于芯 王力机器人安全门的“减法艺术

    宋代的美学和艺术成就是公认的中国古代高峰,其标志性的特点就是简洁美。摄影、木雕等艺术,无不把“做减法”作为艺术创新的高级技法和标准。乔布斯更是划时代的让我们看到了工业产品“做减法”的美和创新力。追求
    的头像 发表于 11-17 16:26 291次阅读
    简于形精于器智于芯 王力机器人安全门的“减法<b class='flag-5'>艺术</b>”

    把您的 PCB 艺术品带来 KiCon 吧

    “ 每位工程师都是艺术家;每次会议都应该有属于自己的徽章。让您的作品在 KiCon Asia 闪亮!** ”** 图片引用自 HACKADAY 2023 KiCon Asia 报名通道已经开启
    发表于 10-20 10:43

    《 AI加速器架构设计与实现》+第一章卷积神经网络观后感

    《 AI加速器架构设计与实现》+第一章卷积神经网络观感    在本书的引言中也提到“一图胜千言”,读完第一章节后,对其进行了一些归纳(如图1),第一章对常见的神经网络结构进行了介绍,举例了一些结构对应的神经网络有哪些,也看到了自己在k210中用到的FAST RCNN和RestNet18分类网络,需要保证硬件实现和算法一致,这样才事半功倍,否则,可能会差别比较大。对于神经网络算法的执行,加速器的设计十分重要,介绍了GCN模块(如下图2),指出了GCN目前面临的挑战,以及GCN模块之间的关系(如图3)。本书对网络进行抽象,得到多个更小的基本块,例如在残差块中,就出现了不同的变化方法,利用1*1的卷积进行升维和降维(如图4),还可以调整直连的位置来对其做出调整,介绍图形结合,比较利于理解。对于初端块,举例了不同初端块结构(如图5),了解到神经网络中的\"跳跃连接块\"(Skip Connection Block)和\"组卷积块\"(Grouped Convolution Block)是两种不同的网络模块,用于改进神经网络的性能和特征提取能力。跳跃连接块是一种模块,通常用于深度卷积神经网络中,特别是在残差网络(Residual Network,ResNet)中广泛使用,也是我比较熟悉的。组卷积块是一种卷积神经网络中的模块,其主要目的是将卷积操作分成多个组别进行处理。在本章节中,对常见网络算子进行了说明(如图6),卷积神经网络的核心运算方式是卷积操作,池化操作和全连接操作。 图1 思维导图 图2 GCN模块分布图 图3 GCN模块之间的关系图 ![1cdc490d87c1aa877ea5e9f44d0297a0f8483cfccded5c78b8e58dd109349e26.png](//file1.elecfans.com/web2/M00/A2/88/wKgZomT_CPGARiSjABPMsn2Z6ZY685.png) 图4 使用残差结构进行升维和降维 图5 初端块不同的结构 图6 网络常见算子
    发表于 09-11 20:34

    多元共进|科技促进艺术发展,助力文化传承

    科技发展助力文化和艺术的传播 融合传统与创新,碰撞独特魅力 一起来了解 2023 Google 开发者大会上 谷歌如何依托科技创新 推动艺术与文化连接 传承和弘扬传统文化 自 2011 年成立以来
    的头像 发表于 09-08 20:15 401次阅读
    多元共进|科技促进<b class='flag-5'>艺术</b>发展,助力文化传承

    实时3D艺术最佳实践-纹理技术解读

    、mipmapping和法线贴图。 本指南也以Unity学习课程的形式提供-Arm&Unity Presents:移动应用程序的3D艺术优化
    发表于 08-02 06:12

    从评论中生成艺术的开源项目

    电子发烧友网站提供《从评论中生成艺术的开源项目.zip》资料免费下载
    发表于 07-05 11:06 0次下载
    从评论中生成<b class='flag-5'>艺术</b>的开源项目

    使用Pi和Python制作艺术、游戏等

    电子发烧友网站提供《使用Pi和Python制作艺术、游戏等.zip》资料免费下载
    发表于 06-27 09:24 0次下载
    使用Pi和Python制作<b class='flag-5'>艺术</b>、游戏等

    LED像素艺术开源分享

    电子发烧友网站提供《LED像素艺术开源分享.zip》资料免费下载
    发表于 06-19 15:28 0次下载
    LED像素<b class='flag-5'>艺术</b>开源分享

    帮忙推荐无带驱动的无方案BLDC方波

    帮忙推荐无带驱动的无方案 BLDC方波
    发表于 06-16 06:35

    基于电流误差和PLL估算的无FOC算法MATLAB代码生成技术直播资料

    不下去。解决工程师项目痛点。 直播回放: https://t.elecfans.com/live/2342.html 课件资料:*附件:基于电流误差和PLL估算的无FOC算法MATLAB代码生成技术直播资料分享.rar
    发表于 06-14 11:36

    手把手教你无FOC电机控制,MATLAB代码生成

    华夏电子工作室:2023年6月8日下午3点(15:00)电机控制MATLAB代码生成系列课程直播第一季。邀请各位工程师准时来直播间讨论和观看。届时代码全开源。 下面我们来说一下FOC简单框架: 该
    发表于 05-29 10:12

    手把手教你MATLAB无FOC电机看着代码生成,付赠资料。

    华夏电子工作室:2023年6月8日下午3点(15:00)电机控制MATLAB代码生成系列课程直播第一季。邀请各位工程师准时来直播间讨论和观看。届时代码全开源。 下面我们来说一下FOC简单框架: 该
    发表于 05-29 10:11

    手把手教你MATLAB,Sumlink代码生成。无FOC算法从零到生成代码的过程。附上MATLAB代码生成仿真模型。

    华夏电子工作室:2023年6月8日下午3点(15:00)电机控制MATLAB代码生成系列课程直播第一季。邀请各位工程师准时来直播间讨论和观看。届时代码全开源。 下面我们来说一下FOC简单框架: 该
    发表于 05-28 12:33

    手把手教你MATLAB,Sumlink电机控制代码生成,内容表贴电机凸极电机无FOC重载启动。系列课程免费直播在线互动。

    (无.lib文件)。本次直播,主讲无FOC框架.MATLAB,SIMULINK从0搭建一个FOC框架,并代码生成。无观测器算法原理及代码生成。 这是搭建的MATLAB模型,可以仿真
    发表于 05-26 14:00