林枫の网志

May the Force be with you

香榧 (fěi)是中国特有树种,也是世界上稀有的经济树种 .

程序员是否要学习使用VIM

  • 个人的回答是肯定的.为什么呢?因为你永远不知道,程序会运行在怎样的服务器.Linu服务器上没有平时开发使用的IDE,VIM这种上古神器,就是特别有用.

进步还是退步

  • 人类借助发明的工具来满足生活生产的需要,使用生产生活更高效便捷.IT界也不离外,从打卡纸带到图形界面,再到AI.但这个过程中,并没有因为工具的先进带来个人能力的相对飞升,反而是工具越强大,很多基本技能就没有了.

  • 宝塔让大部入门的人,忘记了安装基本运行环节.Jenkins的全自动测试,发版.让很多人根本不知己写的程序是怎么运行在服务器上的.很多人就变成了CRUD BOY,最后就成’水货’了.

  • 最终在工作N年后,才发现,基础才是最重要的,其他的,只是构建于基础之上的”浮云”. 慢慢卷
    网络,计算机运行原理,算法,数据结构…

引用资料

本周小侄女降生 ,^_^. 文章由AI辅助生成

提高代码的可读性和可维护性

在编写代码时,统一的代码风格和命名方式有助于提高代码的可读性和可维护性。以下是一些建议:

  1. 一致性: 保持代码的整体一致性,使得整个项目的代码看起来更为统一。这包括缩进、空格使用、注释风格等。

  2. 命名清晰: 使用清晰、具有描述性的变量和函数名。避免使用过于简单或过于复杂的名称,让人容易理解变量或函数的用途。

  3. 驼峰命名法: 对于变量名、函数名等标识符,建议使用驼峰命名法(camelCase),即第一个单词小写,后面的每个单词首字母大写。

  4. 下划线命名法: 对于常量或全局变量,可以使用下划线命名法(snake_case),即单词间用下划线连接。

  5. 避免缩写: 尽量避免过多的缩写,除非是广泛认可的缩写。使用清晰的命名可以提高代码的可读性。

  6. 统一注释风格: 使用一致的注释风格,例如使用双斜线注释(//)或块注释(/* */)。注释应该清晰、简洁,解释代码的目的或特殊处理。

  7. 代码缩进: 选择一种缩进风格(例如,使用空格或制表符),并在整个项目中保持一致。通常,使用四个空格作为一个缩进的标准。

  8. 括号使用: 在控制结构(if、for、while等)中,保持一致的括号使用风格,例如在新的一行开始或在同一行。

  9. 文件命名规范: 采用有意义的文件名,并保持一致。文件名可以反映文件内容的主要功能或目的。

  10. 版本控制规范: 在使用版本控制时,采用一致的提交信息规范,以便更容易追踪和理解代码的变更历史。

这些建议旨在提高代码的可读性和可维护性,使团队成员能够更容易地理解和协作。在项目中,与团队一起制定并遵循一致的代码规范是一个良好的实践。

离立冬只有3天,但天气预报显示,最高温度有29度,真是太热太反常了.

X-Y Problem

对于X-Y Problem的意思如下:

1)有人想解决问题X
2)他觉得Y可能是解决X问题的方法
3)但是他不知道Y应该怎么做
4)于是他去问别人Y应该怎么做?

简而言之,没有去问怎么解决问题X,而是去问解决方案Y应该怎么去实现和操作。于是乎:

1)热心的人们帮助并告诉这个人Y应该怎么搞,但是大家都觉得Y这个方案有点怪异。
2)在经过大量地讨论和浪费了大量的时间后,热心的人终于明白了原始的问题X是怎么一回事。
3)于是大家都发现,Y根本就不是用来解决X的合适的方案。

X-Y Problem最大的严重的问题就是:在一个根本错误的方向上浪费他人大量的时间和精力!

示例

举几个例子:

1
2
3
4
5
6
Q) 我怎么用Shell取得一个字符串的后3位字符?
A1) 如果这个字符的变量是$foo,你可以这样来 echo ${foo:-3}
A2) 为什么你要取后3位?你想干什么?
Q) 其实我就想取文件的扩展名
A1) 我靠,原来你要干这事,那我的方法不对,文件的扩展名并不保证一定有3位啊。
A1) 如果你的文件必然有扩展名的话,你可以这来样来:echo ${foo##*.}

再来一个示例:

1
2
3
4
5
6
7
8
9
10
11
Q)问一下大家,我如何得到一个文件的大小
A1) size = ls -l $file | awk '{print $5}'
Q) 哦,要是这个文件名是个目录呢?
A2) 用du吧
A3) 不好意思,你到底是要文件的大小还是目录的大小?你到底要干什么?
Q) 我想把一个目录下的每个文件的每个块(第一个块有512个字节)拿出来做md5,并且计算他们的大小 ……
A1) 哦,你可以使用dd吧。
A2) dd不行吧。
A3) 你用md5来计算这些块的目的是什么?你究竟想干什么啊?
Q) 其实,我想写一个网盘,对于小文件就直接传输了,对于大文件我想分块做增量同步。
A2) 用rsync啊,你妹!

再来一个示例:

1
2
3
4
Q) x工,我们想在这个地方加一个搜索
A1) 这里内容不多,要搜索什么内容?
Q) 方便我们找到人员,方便做Y操作
A1) 搜索没必要,直接加一个操作就可以了

这里有篇文章说明了X-Y Problem的各种案例说明,我从其中摘出三个来让大家看看:

1
2
3
你试图做X,并想到了用Y方案。所以你去问别人Y,但根本不提X。于是,你可以会错过本来可能有更好更适合的方案,除非你告诉大家X是什么。

— from Re: How do I keep the command line from eating the backslashes? by revdiablo
1
2
3
有些人问怎么做Y,但其它他想做的是X。他问怎么做Y是因为他觉得Y是最好搞定X的方法。 于是大家不断地回答“试试这个,试试那个”来帮助他,而他总是在说“这个有问题,那个有问题,因为……”。基本不同的情况,其它的方案可能会更好。

— from Re: Re: Re: Re: regex to validate e-mail addresses and phone numbers by Limbic~Region
1
2
3
X-Y Problem又叫“过早下结论”:提问者其实并不非常清楚想要解决的X问题,他猜测用Y可以搞定,于是他问大家如何实现Y。

— from <Pine.GHP.4.21.0009061210570.8800-100000@hpplus03.cern.ch> by Alan J. Flavell

其实这个问题在我之前的《你会问问题吗》里提到的那篇How To Ask Questions the Smart Way中的提到过,你可以移步去看一下。

所以,我们在寻求别人帮助的时候,最好把我们想解决的问题和整个事情的来龙去脉说清楚。

一些变种

我们不要以为X-Y Problem就像上面那样的简单,我们不会出现,其实我们生活的这个世界有有各种X-Y Problem的变种。下面我个人觉得非常像XY Problem的总是:

  • 其一、大多数人有时候,非常容易把手段当目的,他们会用自己所喜欢的技术和方法来反推用户的需求,于是很有可能就会出现X-Y Problem – 也许解决用户需求最适合的技术方案是PC,但是我们要让他们用手机。

  • 其二、产品经理有时候并不清楚他想解决的用户需求是什么,于是他觉得可能开发Y的功能能够满足用户,于是他提出了Y的需求让技术人员去做,但那根本不是解决X问题的最佳方案。

  • 其三、因为公司或部门的一些战略安排,业务部门设计了相关的业务规划,然后这些业务规划更多的是公司想要的Y,而不是解决用户的X问题。

  • 其四、对于个人的职业发展,X是成长为有更强的技能和能力,这个可以拥有比别人更强的竞争力,从而可以有更好的报酬,但确走向了Y:全身心地追逐KPI。

  • 其五、本来我们想达成的X是做出更好和更有价值的产品,但最终走到了Y:通过各种手段提升安装量,点击量,在线量,用户量来衡量。

  • 其六、很多团队Leader都喜欢制造信息不平等,并不告诉团队某个事情的来由,掩盖X,而直接把要做的Y告诉团队,导致团队并不真正地理解,而产生了很多时间和经历的浪费。

所有的这些,在我心中都是X-Y Problem的变种,这是不是一种刻舟求剑的表现?

链接&&参考

本周小节

机器人

用PHP作为主要的开发语言的创业团队.php-fpm模式是公司发展早期,业务交互主要的实现方式.随着业务的发展,数据量的激增,接口背后的服务会被拆成分步(异步),接口从实现业务逻辑,变成组合各种服务的入口.

据个人的观察,销售人员比技术人员更容易走上创业的道路,和系统接口前后端分离似有异曲同工之妙.

68岁离世,大家都说太年轻了.但35岁在职场已经被打上#年龄大#的标签.

推荐软件工程好文:《对抗软件复杂度的战争》

作者许晓斌是《Maven实战》作者,很多见解都很有深度。

研发效率下降的背后,核心因素是来源于软件复杂度的上升。

作者借用《人月神话》的论述,将软件复杂度分为本质复杂度(Essential Complexity)和偶然复杂度(Accidental Complexity)。

本质复杂度,指的就是来自问题本身带来的复杂度,比如用户规模过大,技术难度很高;而偶然复杂度则来源于解决方案本身,例如你选择的技术带来的,比如你选择某前端需要去学习,选择了某分布式框架引入了复杂度,还有团队成员的工程管理、项目管理等等。

而要解决复杂度带来的问题,应对方法不对可能会治标不治本。

比如常见的一个错误方式就是设置不靠谱切不可更改的Deadline,即使靠加班和缩小需求范围也无法达成,最终只有牺牲软件质量,反而是大幅提升了偶然复杂度。

还有一种错误方式就是用所谓“先进”技术,例如微服务,或者某个新出的前端框架。但如果你面临的问题从业务的角度来说,正好是这种先进技术所能弥补的,那么没问题,但如果你的问题是研发效率问题,先进技术不仅不能帮忙,还反而因为新老技术切换带来更多的偶然复杂度。

那么什么是正确的应对方式。

一种方式是宏观层面。

将一些复杂的系统,分离出去,通过购买或使用第三方成熟系统来降低复杂度,例如数据库、调度系统、消息队列等等。

通过对系统架构和组织架构的调整,将系统的复杂度层层分解,将复杂的系统拆分成相对简单的模块,同时组织架构和系统架构保持一致。

一种方式是微观层面,提升代码质量、增加单元测试的覆盖,并且从团队的流程、工程文化上下功夫,借助好的流程,例如CI/CD和代码审查;激励消除复杂度的行为;让增加、降低复杂度的行为透明。

我觉得文章中提出的复杂度问题都是很现实的问题,从宏观和微观两个层面入手也是很好的思路,但还是需要根据团队的情况自己调整。

推荐阅读原文

#软件工程之美#

http://t.cn/A6W4Dpiz

0%