再论"业余"和"专业"--致力职业化 提高成功力

Windows平台高效BLE调试工具开发指南 本文为开发者提供了一份在Windows平台上开发高效BLE调试工具的详细指南。文章深入探讨了使用32feet.NET库进行蓝牙低功耗设备扫描、连接、数据通信及进阶功能开发的实战经验,旨在帮助开发者打造功能自定义、性能优化的专属调试利器,显著提升物联网和嵌入式设备的调试效率。 阅读详情

再论"业余"和"专业"

----致力职业化 提高成功力

文档版本

版本

创建时间

创建人

备注

1.0.0926.1

2003-9-26

郑昀

第一稿

1.0.0927.1

2003-9-27

郑昀

第二稿

 

 

SQWebMail之烂

外面比较盛行的一种qmail的Web界面,是SQWebMail,还算是比较受人追捧的,而且框架搭也算是好的。

但你看看他的源代码。不说别的,只要看主程序sqwebmail.c的源代码就知道了,严格说,这整个工程一点也不符合软件工程编码规范。

sqwebmail-3.3.1文件夹下有818个文件,27个子文件夹,但是注释呢,命名规范呢?其中代码耦合性也太强,动一发而牵全身,很不好维护。这竟然是一帮大学里的教授后来改进的版本,一砣:

/*

** Copyright 1998 - 2001 Double Precision, Inc.  See COPYING for

** distribution information.

*/

static void do_output_form_loop(FILE *f)

{

     if (strcmp(kw, "a") == 0)

         {

              …

         }

         else if (strcmp(kw, "d") == 0)

         {

              …

         }

         else if (strcmp(kw, "D") == 0)

         {

              …

         }

         else if (strcmp(kw, "G") == 0)

         {

              …

         }

         else if (strcmp(kw, "r") == 0)

         {

              …

         }

         else if (strcmp(kw, "s") == 0)

         {

              ….

 

微软的源代码

让我们再来看看微软的源代码,这个源代码大家机器上都有,不是什么秘密,就在C:/Program Files/Microsoft Visual Studio/VC98/CRT/SRC下面,看看人家怎么做的,再看看sqWebMail。

    咱们不讨论算法意义上的有无漏洞,兹为了说明代码的可读性,举一个最简单的例子,微软的工程师是这么写一个strlen的经典实现:

/***
*strlen.c - contains strlen() routine
*
*       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
*       strlen returns the length of a null-terminated string,
*       not including the null byte itself.
*
*******************************************************************************/

#include
#include

#ifdef _MSC_VER
#pragma function(strlen)
#endif  /* _MSC_VER */

/***
*strlen - return the length of a null-terminated string
*
*Purpose:
*       Finds the length in bytes of the given string, not including
*       the final null character.
*
*Entry:
*       const char * str - string whose length is to be computed
*
*Exit:
*       length of the string "str", exclusive of the final null byte
*
*Exceptions:
*
*******************************************************************************/


size_t __cdecl strlen (
        const char * str
        )
{
        const char *eos = str;

        while( *eos++ ) ;

        return( (int)(eos - str - 1) );
}

    当然,微软的STL实现版本是公认的可读性差,我也看不过眼,换了STLPort了事。

 

想跟Microsoft,Oracle,CA,IBM竞争吗?

在我看来,我不管你是什么软件公司,管你是什么主义战士,就一个原则,要是不会写文档,不会写注释,写个函数连个输入输出异常注释都没有,那你就别在这行混了,不够丢人现眼的。有时间也翻翻软件工程,软件管理的书,看看那个书上赞成软件没有注释,没有文档?

    花钱买享受,这是人生的一个基本原则,干吗在那里吭哧吭哧一代人又一代人反复看着同一批糟糕的源代码,还给自己脸上贴金“源代码剖析”,那是因为你不剖析都不行。简直就是浪费生命。公司要赚钱,要快。没本事写注释的人就开掉,没本事遵循软件工程的人就开掉,这就是我的原则。想加入CMM的行列吗?最起码你的公司要过ISO9001吧?

你们公司有吗?就靠没注释没文档?能过吗?能够跟Microsoft,Oracle,CA,IBM竞争吗?

 

自由软件的“自由”含义:

自由软件,一般指遵循GPL或LGPL规则的程序。GPL或LGPL规则要求源代码公开,并且允许你在遵循GPL或LGPL的情况下享有共享和修改自由软件的自由。

 

    当我们谈到自由软件(free software)时,我们指的是自由而不是价格。我们的GNU通用公共许可证决意保证你有发布自由软件的自由(如果你愿意,你可以对此项服务收取一定的费用);保证你能收到源程序或者在你需要时能得到它;保证你能修改软件或将它的一部分用于新的自由软件;而且还保证你知道你能做这些事情。

 

    首先,GPL规则中并没有要求软件的维护者一定要提供详细的文档和注释(而且我找了几个著名的自由软件源代码看了一下,注释还是有的,只不过没有详细到每行代码都有的地步。)。我认为详细的文档和注释作者是作为服务提供的,而服务是要收费的。国内的第一个开源软件项目Minigui(一个极好的中文图形界面,可以只有2兆大小),他提供源代码和用户使用说明的详细文档,至于开发文档和函数库说明,他会收取600元的费用。我认为这个价格只是个成本价,假如你连这点费用都不肯付的话,那就没什么好说的了。

 

至于微软,由于你根本就见不到源代码,所以根本不存在为他的文档和注释发愁的情况。不要说你们公司能见到部分源码,你们是微软的合作伙伴,那别的人呢?而自由软件的源码是对所有人开放的。更何况你们也只能见到一小部分源码而已。而且微软决不会允许你把他的产品移植到别的操作系统上或一些新的机器上的,这些工作只有他自己才能做,因为你见不到所有的相关源代码。而自由软件就可以,你可以把他移植到任何一个操作系统上,包括windows。一个新的cpu芯片出来,没多久就会有一个黑客把linux移植上去,而这个黑客并不是linux的维护者,为什么他可以作到这样的事呢,因为自由软件是源码公开的。

 

    我认为微软之所以提供详细的文档和接口说明,部分原因是他不提供源代码,不得不这么做,否则别人就没有任何办法去使用他的产品了。当然了,微软产品的简单易用是出了名的。可是由于你没有源码,很多时候为了达到某个目的,除了微软替你去做,你是根本无法完成的。例如高性能和新的功能。你难道可以命令微软去做这一切么?

 

    所以,不要对自由软件有这么大的意见。假如你想要详细的文档,你可以购买他们的服务。如果维护者不是某个公司,而是个人行为的话,你可以和他本人联系(一般他都会留下e_mail),也许他不收费就会提供给你的,即使收费,我想也不会比微软更贵的!

 

 

 

做Coding,还是多一点职业道德

专业做Coding,还是多一点职业道德,多看看软件工程的书。想想如果是你开公司,你难道会鼓励你手下的人不写注释,不写文档吗?

有机会的话,读读《Code Complete》(http://www.youkuaiyun.com/develop/Read_Article.asp?Id=10997),这本几十年前的书,就已经说得很明白了:

交流和合作

    真正优秀的程序员应学会怎样和别人工作和娱乐,编写可读代码是对程序员作为组中一员的要求之一。

    计算机也就同其它人一样能读懂你的代码,但是它要比其它人更能阅读质量差的代码。作为可读性原则,你应将修改你的代码的人时刻记在心上。开发程序首先应同程序员交流,其次则是和计算机交流。

    绝大多数高水平程序员喜欢使自己程序的可读性强,并抽出充足的时间这样作。虽然只有一些人能坚持到底,而且其中一些人还是高水平的代码编写者,对开发中程序员级别的了解,有助于解释什么地方适合于此原则:

    级别1:初学者

    初学者是能使用一种语言基本能力的程序员,这样的人能够使用子程序、循环、条件语句和其它许多语言特征。

    级别2:中间者

    中间级程序员有使用多种语言的能力,并且至少非常熟悉某一种语言。

    级别3:专家

    编程专家对其语言或环境或对这二者有着很深的造诣,这种级别的程序员对公司有价值的,而且有些程序员往往就停留在这个水平上。

    级别4:大师

    大师有着专家那样的专业知识,并能意识到编程只是15%和计算机交流,其余85%是和人打交道。一般程序员只有30%的时间甚至更少。大师所编写的代码与其说是给计算机看倒不如说是给人看的。真正的大师级程序员所编写的代码是十分清晰易懂的,而且他们注意建立有关文档。他们也不想浪费其精力去重建本来用一句注释就能说清楚的代码段的逻辑结构。

    一位不强调可读性的高水平代码者可能停留在级别3的水平上,但是问题还不止如此。依作者本人的经验,人们编写不可读代码的主要原因在于他们所编代码质量较差。他们并不是自言自语地说:“我所编代码不好,所以我要使其难以读懂”,而是他们并不能完整地理解自己的代码以致于不能使其是可读的,这就使他们只能停留在1或2级的水平上。我所见的最差的代码是由一个任何人看了她的程序后都会望而生畏的人所编写的。最终,她的上司威胁说如她再不改正就要解雇她。她的代码是不作注释的,并且其程序中充满了如x,xx,xxx,xx1和xx2这样的全局变量。她的代码给了她大量的机会显示她的改错能力。

 

记住我们是专业程序员,我们的视角一定要和业余的区分开来。

我们不是自由软件工作者。

我们是靠这个赚钱的。

所以,你用不着替他们辩护。因为你天生应该喜欢让你赚到更多钱的事物。

我赞同微软的商业运作方式。我赞同付费服务。因为我也是靠这个吃饭的。

不管是微软,还是IBM,都有许多这方面的专家现身说法,多读读这些人的书。别相信那些小公司的或者在校的学生,有时候他们的话是毒药,会毒害你的心灵,蒙蔽你的双眼,让你看不清楚商业社会里面的游戏规则。

 

"业余"和"专业"

下面摘录透明采访软件思想家Gerald Weinberg的访谈摘录,在http://www.umlchina.net/touming.html:

 

   "业余"和"专业"

 

   "程序开发"这个词所蕴含的行为方式是无穷无尽的。  

  一位业余程序员可能刚刚用六条语句写就了一个BASIC程序,可以用来求解二次方程的根,便开始就程序开发的理论与实践侃侃而谈--最令专业程序员们反感的,莫过于此。

 

   --《程序开发心理学》,第7章

 

   《程》:我注意到您多次强调"业余程序员"和"专业程序员"之间的差异……

 

   GW:因为我认为这是一个非常重要的观念。并不是"以编程为生的人"就有资格自称"专业程序员"的,但真正对软件学科起到推动作用的全然是专业程序员。这并非贬低业余程序员,任何一门学科都有业余爱好者,这无可厚非。但有必要划清业余选手和专业选手之间的界限,这样业余选手也能找到自己努力的方向。

 

   《程》:可是,如今软件的范围如此宽泛。从政府机关到航天飞机,从移动电话到超级市场,到处都有软件。各种软件之间的差异如此巨大,我们又该如何区分专业程序员和业余程序员呢?

 

   GW:在我看来,首先应该考虑的是他们编程的目的。如果只是为一己私利而编程,如果编程的结果对别人毫无影响,这就是业余程序员的编程方式。

  举个例子吧,计算机系的研究生在知识的深度和广度上都已经相当不错了,但他们通常只是为自己编程--为了学习、或者为了拿到学位,所以他们仍旧只是业余程序员。如果他们在学习之余还有一份工作,为别人开发实际使用的软件,这时他们就是专业程序员。

  请记住,专业程序员未必都很出色,业余程序员也可能出类拔萃,但他们编程的目的是不同的,这决定了他们之间本质性的差异。

 

   《程》:自从知道您对"专业"和"业余"的划分之后,我就一直想了解您对共享软件(share-ware)的看法。很多年轻程序员怀着淘金梦去做共享软件,您认为共享软件对于软件行业有什么贡献?

 

   GW:几乎所有的共享软件都是垃圾。虽然商业软件和开源软件也有不少垃圾,但共享软件几乎全是垃圾。我曾经试用过一些共享软件,但仅仅是尝试而已。如果我要掏钱买一个软件来用,我一定要求有一家值得信赖的公司为它提供支持。至少在美国,值得信赖的软件公司并不多。很多公司开张不到五年就倒闭,然后他们的顾客再也得不到任何支持。而共享软件,它们的用户能得到的保障就更少了。不,至少我不会去买这样不可靠的软件。

  如果从软件行业的角度来说,共享软件给年轻人们灌输了很糟糕的习惯,让他们以一种业余选手的方式工作。共享软件的作者们习惯于单打独斗,总是凭着自己的爱好工作,这种牛仔式的工作方式至少是缺乏专业精神的。

 

小结

      我的想法就是,共享软件或者帮别人打零工的制作流程,给了年轻气盛的程序员们一种缺少项目管理的开发环境,这是不太好的修炼方式,容易走火入魔。

 

“即使是一个不够完美的东西,在某个特定时期也有他存在的价值”,这个辩证法我当然同意。但是我认为一个项目的源代码最基本的构成因素就是代码和注释和文档,这是三要素,如果没有这些东西,就像生下个儿子却没有JJ一样,根本就没有面世的必要。所以这不是完美不完美的问题。

 

开源项目和商业软件,如果不遵守基本项目生存规则,无论其中有多么高的高手参与,一样会失败。

我赞同商业开发模式,但不反对开源,如果做得好,我们也会拿来主义。如果做得只是一个徒有代码和功能的开源项目,那我觉得他会走向衰亡。看看SourceFouge上的那么多东西,真正有几个能够为商业社会所采用?几率有多大?其实像有着优秀项目的人,如果归拢到公司里,可能会有更大的发展。因为商业公司有足够的财力推广,有足够的人力包装。

 

欢迎指正和讨论。

 

本文档所包含的信息代表了在发布之日,zhengyun_ustc对所讨论问题的当前看法。

本文档仅供参考。

用户必须遵守所有适用的版权法。在不对版权法所规定的权利加以限制的情况下,如未得到 zhengyun_ustc和youkuaiyun.com明确的书面许可,不得出于任何目的、以任何形式或手段(电子的、机械的、影印、录制等等)复制、传播本文的任何部分,也不得将其存储或引入到检索系统中。

 

Thank CJW

Written by zhengyun_ustc ( at ) hotmail.com



Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=12732


使用TensorFlow搭建FNN(全连接神经网络)的基本步骤 提示:转载请注明出处,若本文无意侵犯到您的合法权益,请及时与作者联系。 目录 一、定义神经网络的输入输出 二、搭建神经网络 1、定义一个神经层中的权重 2、定义一个神经层中的阈值 3、定义一个神经层中的激活函数 4、组合神经层为神经网络 三、搭建损失函数和优化器 1、搭建损失函数 首先介绍第一个函数这其中用到的共同的函数为 2、定义优化器 四、训练神经网络 全连接神经网络的网络结构如下: 一、定义神经网络的输入输出 神经网络最擅长的工作就是模拟非线性函数,即一个复杂的高.. 阅读详情

相关推荐

PCIe信号眼图总是不开?手把手教你调CTLE和DFE参数(附实测波形对比)

本文详细解析了PCIe信号眼图调试中CTLE和DFE参数的优化方法,帮助硬件工程师解决眼图无法张开的问题。通过实际案例和步骤指导,介绍了如何调整CTLE直流增益和DFE抽头系数,提升接收端均衡器性能,确保信号完整性。

weixin_26805597的博客 216

程序员成长之路(转)

什么时候才能成为一个专业程序员呢?三年还是五年工作经验?其实不用的,你马上就可以了,我没有骗你,因为专业程序员与业余程序员的区别主要在于一种态度,如果缺乏这种态度,拥有十年工作经验也还是业余的。 什么态度?专业态度!也就是星爷常说的专业精神。专业态度有多种表现形式,以后我们会一一介绍的。这里先介绍一下有关形象的态度,专业的程序员是很注重自己的形象的,当然程序员的形象不是表现在衣着和...

di0808的博客 409

ubuntu20.04下内核源码下载分析

ubuntu 20.04下内核源代码下载,配置编译环境写在前面一、安装VMware Workstation和Ubuntu20.04二、修改apt源合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 写在前面 我最近的科研工作需要使用到对ubun

冰冻三尺非一日之寒 1万+

这就是专业和业余的差距!亲身经历,好惨……

上周日和一个省队下来的朋友(未退时进过全国专业比赛前四)学了很多东西,今天下午约了她2点到4点南师体育馆一起打球,真不好意思,没说清地点,让她在别的球场等了10分钟。 在她来之前,先忽悠了一个朋友,告诉他有个美女来打球,打的不错,动员他和她比赛一场,赌一顿饭,哈哈,忽悠成了! 这个朋友球龄4年,他自己觉得在业余球友当中应该是中等偏上水平,在我们圈子中认我第一,他排第二。我们平时比赛...

小抛 716

【AI智能体】Claude Code 高级编程技巧实战项目详解

Claude Code 高级编程技巧实战项目详解

congge 1万+

板蓝根挥发油微胶囊化技术及其在抗菌织物整理中的应用研究

微胶囊技术是一种通过成膜材料将具有反应活性或挥发性的液体或固体包封成微小颗粒的技术。该技术因其优异的缓释保护和物态改变性能,已在医药、食品、化妆品等多个领域得到广泛应用。本研究采用复凝聚法制备板蓝根挥发油的微胶囊,利用明胶和阿拉伯胶作为壁材,旨在提升其稳定性和抗菌性能。

qq_62634009的博客 584

职业程序员与业余程序员的区别

职业程序员的设计时间长于编码时间,业余程序员的编码时间长于设计时间......

blackcat123的博客 289

在blender中安装vtk插件

Blender 是一个开源的、功能强大的3D计算机图形软件,广泛用于创建动画片、视觉效果、艺术作品、3D打印模型、互动3D应用程序和视频游戏。Blender 是由 Blender 基金会开发和维护的,具有丰富的功能和灵活的扩展性。在github上下载zip插件。

如果想成为中心,那么就到中心去吧。 294

[PM]《再论"业余"和"专业"》的o6z经典评论留念

很久以前写过一篇较为幼稚的文章《“再论"业余"和"专业" ----致力职业化 提高成功力》,曾经引来了许多许多评论。时隔一年,这件事带给我的思想上的冲击已经忘却了,不想又被一个名为“Ferry的思想碎片”的blog钩起。它总算是保存了一点当时类似于《功夫》斧头帮百人大战的混乱场面的精彩言语。现在你从http://www.youkuaiyun.com/Develop/article/21/21289.shtm已

移动开发与培训 457

知识图谱-构建:知识图谱构建流程【本体构建、知识抽取(实体抽取、 关系抽取、属性抽取)、知识表示、知识融合、知识存储】

旅游领域的类是用来描述旅游的抽象化概念术语,是对众多旅游个体共性的概念化描述。术语是划分类的基础,根据构建领域本体的目标和具体需要,可以确定哪些术语能作为领域本体的类。在以上抽取的众多旅游领域术语中,有些是能直接作为类的,如旅游、人物、交通方式、景区等等,而有些则不能作为类,如票价、景区门票、联系方式等等,它们只是属性。“旅游”很明显是最顶层的类,是父类。然后,要确定旅游的子类,根据大众标签里体现的共性和《中国分类主题词表》确定了旅游领域的11个核心概念,即本体层次结构图数据属性(固有属性)...

u013250861的博客 4万+

如何在SpringBoot中实现AI 流式输出?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1484
上一篇: [Spam]垃圾邮件者纲要(Spammer's Compendium)
下一篇: 不翼而飞的Windows Fax Service
techcrunch
博客等级 码龄19年 34粉丝 3441原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值