开发思想 – KISS/DRY、奥卡姆剃刀、重复发明轮子、过度工程/设计/YANGNI

重复发明轮子

每个开发人员都有英雄主义情结,这种情结驱动我们去做一些创造性的工作,严重的情况下,我们会情不自禁地重复发明轮子(re-invent the wheel)。

譬如,我们发现JavaScript里没有方法方便我们对一个数组进行快速操作,我们就动手开始写了,或许,你应该先看看Underscore或者更好的Fork版本Lodash。

譬如,大家用.NET开发一个游戏,发现没有脚本引擎类库,打算自己写一个,或许,你可以考虑一下DLR (Dynamic Language Runtime)支持的那些Iron系列,譬如IronRuby、IronPython等等。

譬如,大家用Xamarin开发了iOS/Android手机App,希望采集一些运行时信息,譬如用户的使用情况、程序产生的错误等等,所以打算自己写一个,其实,微软针对Xamarin开发了一个手机app管理平台:Mobile Center ( https://mobile.azure.com )

所以,我们不应该重复自己(DRY),不应该WET(Write Everything Twice),要KISS(Keep It Simple, Stupid!),正如我在另外一篇文章里所说的:https://kayow.com/2018/06/softwaredevelopmentthoughts1/ 

过度设计

极端情况下,我们会实现一些现在、短期甚至中期都不会用到的功能,这就是over-engineering(过度设计)。

譬如,我们设计一个内部使用的系统,现在公司员工数量有100个,我们预计并发用户数是50,根据公司的发展规划,接下来5年人数不会翻倍,所以我们的设计完全可以按照75个员工并发进行。

为什么不应该过度设计?譬如要达满足95%的需求,我们花了95%的时间,剩下了的5%,我们可能需要2倍的时间去实现,而要做到120%,我们可能需要5倍的时间。

而且,就像乌鸦喜欢收集一些闪亮的小玩意那样,我们热衷于研究那些很火热很炫酷的技术,这样才能显得我们特立独行,比别人优异。严重者,会不顾一切把这些技术引入现有的产品中,譬如一些Web项目原来是用angularjs编写的,因为react火,所以我们就用react重写了前端,那这个耗时的工作除了满足了开发人员的虚荣心和膨胀的ego,究竟带来了什么实质的产品收益?并没有。

所以,时刻告诫自己,每增加一个新功能之前,都应该问一下自己正:是否真的需要。若无需要,勿增实体,这就是奥卡姆剃刀理论。YANGNI(You Aren’t Gonna Need It),你并不需要它,也是这个意思。

爆栈之旅

是否想技术水平快速提升?是否希望快速成为公司的技术骨干?

核心价值
  • 把我这10多年来所学到的知识、总结的经验、吸取的教训分享出来
  • 针对不同的学生量身定制规划学习成长路线、1对1个人指导、代码审阅等
  • 解答各种技术问题
  • 为公司提供技术解决方案

请查看本站右边的信息联系我。

版权所有

所有文章内容版权所有,任何形式的转发/使用都必须先征得本站书面同意。本站保留一切追究的权利。

开发思想 – 代码的4重:重质、重构、重视和重用

重质

好的程序员的代码:前人栽树,后人乘凉。差的程序员的代码:前人挖坑,后人躺枪​。

问一下自己,我们有多少次,复制粘贴代码?数不清,是吧?

我知道有一些开发人员,读这个专业纯粹是因为当年火热,从事这个职业单纯是知道它赚钱,并不是单纯的热爱开发这个创造性事情。

我还知道,有一些开发人员,完全漠视代码质量,他们的想法大体可以总结如下:

  • 不管我写的代码质量多好,总会有人把它瞎改,所以,我没必要写好代码,犯不着!
  • 不管我写的代码质量多好,客户看见不见,产品也不会漂亮写,所以,犯不着!
  • 不管我写的代码质量多好,老板也不会给我加工资,给我升职,所以,犯不着!

如果你觉得自己鹤立鸡群,身边的都是猪队友,那更应该起带头作用,言传身教,把队友的水平逐步提高,你的工作也舒服很多,这样是双赢的。

代码质量决定了产品的性能、稳定性等等,有问题的代码,不但会影响用户体验,更加可能会对客户造成损失,而你的公司会可能因此付出代价,譬如口碑、市场、赔付等。

如果你真的水平过硬,帮助了队友、产品成长,你觉得老板不会器重你吗?

重视

某司,我给一个代码改动做审查,该改动包含了80多个新文件,总代码量不少,然而该开发人员使用的时间却是相对极短的,所以,要么这个开发人员是超人,要么这个代码是复制粘贴过来的。我随机打开一个文件细看,心想:”咦,这些代码怎么看着这么熟悉?我肯定在什么地方看过!“,再检索一下大脑这么多年来记住的那些代码,我确实是9年前在codeproject上看过这个代码。我当年每天泡各个开源网站看优秀的代码,看过不少优秀的开源项目,所以我肯定它就是我看过的诸多开源项目其中一个。打开codeproject一看,果不其然。

使用开源项目在这里不是问题,因为其许可是允许我们使用在商业产品中的,但是,许可明确指出我们必须:

  • 保留其版权
  • 发布版本中保留一份许可

这个开发人员完全无视了这2条要求,他把80多个文件里面每个文件头都有的版权去掉了,许可也没附带上。

而且,他还把代码直接签入到我们的核心代码中,而不是把这些代码作为NuGet包进行合理的维护,其实,这个codeproject上的版本是有一些问题的,GitHub上有其它网友Fork的版本修正了,还在NuGet上发布了类库包。

而且,该开发人员已经白发苍苍,50多岁,还是不懂得尊重别人的代码。

不管什么代码,我们都应该敬而畏之,不管是害怕它造成问题,还是当宝贝那样珍惜。

不管我们是什么水平,年纪多大,如果要别人尊重我们的代码,我们首先要尊重自己的代码,写高质量的代码,还需要尊重别人的代码。

代码的重构和重用

我们下一篇文章继续详谈。

爆栈之旅

是否想技术水平快速提升?是否希望快速成为公司的技术骨干?

核心价值
  • 把我这10多年来所学到的知识、总结的经验、吸取的教训分享出来
  • 针对不同的学生量身定制规划学习成长路线、1对1个人指导、代码审阅等
  • 解答各种技术问题
  • 为公司提供技术解决方案

请查看本站右边的信息联系我。

版权所有

所有文章内容版权所有,任何形式的转发/使用都必须先征得本站书面同意。本站保留一切追究的权利。

开发思想 – 不确定性雪糕筒、薛定谔的猫、海森bug、最不可能的可能

薛定谔的猫/海森bug

之前说过薛定谔的猫,在量子物理学中,这种状态叫纠缠态。在开发过程中,这叫做:“海森bug”,是开发过程中的不肯定性,具体参考这里:软件开发思想-1-斩草除根

 

不确定性雪糕筒

说起不肯定性,在开发过程中,我们对开发项目的估计,最开始的时候,是与实际情况偏离得最大的,随着开发的进度不断推进,这个不肯定性会不断缩小,到开发的末期,这个估计会和实际情况非常接近,这个过程,我们用2条曲线表示(正负误差),就是一个雪糕筒的形状,这就是不确定性雪糕筒(Cone of uncertainty)。

最不可能的可能

OCaml的主开发人员在给VIP客户做技术支持的时候发现一个诡异的bug,第一反应是CPU有问题,但是客户不配合验证不了他的想法,1年之后,Intel终于确认了其CPU有问题:http://gallium.inria.fr/blog/intel-skylake-bug/
一般来说,我们给系统排错,一般是这样的顺序:
  1. 首先是看某个具体的功能,可能性是95%
  2. 再看模块中各种类型/函数的调用,可能性是50%;
  3. 然后看整个系统的数据流转、API/服务调用关系等等,可能性是25%,
  4. 之后才会考虑可能是第三方的组件/服务的问题,可能性是10%
  5. 接着会考虑是系统的DLL/配置问题,可能是1%
  6. 如果上述都不是,我们才会考虑是编译器/解释器的问题,可能性是0.1%
  7. 如果还没有发现问题,我们才可能考虑是硬件问题,譬如磁盘、内存等,可能性是0.01%
  8. 如果这还没有发现问题,那我们只能怀疑CPU,可能性是0.001%
所以,你会发现,不管可能性有多低,排除了所有其他可能性,剩下了的,不管看起来多荒谬、多不可能,那也会是答案。

爆栈之旅

是否想技术水平快速提升?是否希望快速成为公司的技术骨干?

核心价值
  • 把我这10多年来所学到的知识、总结的经验、吸取的教训分享出来
  • 针对不同的学生量身定制规划学习成长路线、1对1个人指导、代码审阅等
  • 解答各种技术问题
  • 为公司提供技术解决方案

请查看本站右边的信息联系我。

版权所有

所有文章内容版权所有,任何形式的转发/使用都必须先征得本站书面同意。本站保留一切追究的权利。

爆栈之旅-.NET- C# – 数据访问

目录

这是爆栈之旅的1对1私人定制授课的第十二讲,视频+讲义+问答+测试+代码审查等等。

 

 

是否想技术水平快速提升?是否希望快速成为公司的技术骨干?

核心价值
  • 把我这10多年来所学到的知识、总结的经验、吸取的教训分享出来
  • 针对不同的学生量身定制规划学习成长路线、1对1个人指导、代码审阅等
  • 解答各种技术问题
  • 为公司提供技术解决方案

请查看本站右边的信息联系我。

版权所有

所有文章内容版权所有,任何形式的转发/使用都必须先征得本站书面同意。本站保留一切追究的权利。

每周新技术/文章/心得 – 4

爆栈网会员服务包括每周新技术/文章/心得的分享。

本周,我们可以学一下:

是否想技术水平快速提升?是否希望快速成为公司的技术骨干?

核心价值
  • 把我这10多年来所学到的知识、总结的经验、吸取的教训分享出来
  • 针对不同的学生量身定制规划学习成长路线、1对1个人指导、代码审阅等
  • 解答各种技术问题
  • 为公司提供技术解决方案

请查看本站右边的信息联系我。

软件开发思想-2-开发人员应该掌握什么语言/技术?

一技防身

每个开发人员,如果要做得好,都起码熟练掌握一门语言/技术。我们读书的时候学过:学会数理化,走遍天下都不怕。李永乐老师就是一个很好的例子,他的视频大家应该看看。

全栈

不是每个人都能达到全栈,甚至爆栈。

那该掌握什么?

生存和兴趣,你想选哪个?

如果是为了生存,那可以选择那些市场上热门、迫切需要的技术,因为这些技术一般意味着较高的薪酬,譬如最近比较火热的区块链、人工智能/机器学习等等。

如果是为了兴趣,那你可以尽情选择你喜欢的技术、语言。

单纯就语言来说,我觉得应该掌握以下三种:

  • 一种静态语言
    • 譬如C#因为高产开放和跨平台高性能
    • 譬如Java或者Kotlin
  • 一种动态语言
    • 譬如JavaScript因为前端现在是主流开发
    • 譬如Python/Ruby
  • 一种DSL领域专用语言
    • 譬如sql server的t-sql存取数据。

如果都掌握了,那就是初级的全栈:前端、后台、数据存储三个端。

 

爆栈之旅

是否想技术水平快速提升?是否希望快速成为公司的技术骨干?

核心价值
  • 把我这10多年来所学到的知识、总结的经验、吸取的教训分享出来
  • 针对不同的学生量身定制规划学习成长路线、1对1个人指导、代码审阅等
  • 解答各种技术问题
  • 为公司提供技术解决方案

请查看本站右边的信息联系我。

版权所有

所有文章内容版权所有,任何形式的转发/使用都必须先征得本站书面同意。本站保留一切追究的权利。

学员问答精选 – 1 – 数据库表拆分

问题

有学员提问,说他在用一个数据库,里面有一个典型的ToDoList表:

  • id
  • title:标题
  • isFinished:是否完成
  • isRemind:是否提醒
  • remindDateTime:提醒时间
  • remark:备注

因为在用户长时间使用后,已完成的任务会很多,如果把两个表写成一个,可能会有比较多的不必要的检索。

所以,他把这个表拆成两个,结构完全一样,一个叫Undone(未完成),一个叫Done(已完成),Done里面的isFinished的值是true。

可是他后续写业务逻辑的时候,发现这样的写法,当切换任务是否完成的状态的时候,需要更新该任务的isFinish,并将该项从原来的表删除,再加入新的表。

因为该数据库没有提供能直接移动该项到另一个表的方法,后来他也想了想这个结构,感觉有点问题,可是他又说不上来是什么问题。

 

大家觉得这个设计有什么优劣点?你是否能提供更好的解决方案?我下面会提供我的建议。

 

阅读更多

爆栈之旅-.NET- C# – 基础语法

目录

这是爆栈之旅的1对1私人定制授课的第十一讲,视频+讲义+问答+测试+代码审查等等。

 

 

是否想技术水平快速提升?是否希望快速成为公司的技术骨干?

核心价值
  • 把我这10多年来所学到的知识、总结的经验、吸取的教训分享出来
  • 针对不同的学生量身定制规划学习成长路线、1对1个人指导、代码审阅等
  • 解答各种技术问题
  • 为公司提供技术解决方案

请查看本站右边的信息联系我。

版权所有

所有文章内容版权所有,任何形式的转发/使用都必须先征得本站书面同意。本站保留一切追究的权利。

纯技术探讨:大数据分析日本AV究竟谁的评分最好

前言

大家是否想过:岛国动作爱情片,谁都口碑最好?

作为技术人,想知道一样事情,第一反应就是:写个程序验证一下啊!

声明

这是纯技术讨论,本人不提供任何形式的资源,请不要私信。如果你有需要,请自行搜索,谢谢。

数据样本

首先,采集了13574部片子的信息,总共有3405位女优参与演出,平均一位女优参与了4部片子。

需要说明一下的是:

  • 这个数据不完整
  • 这个分数应该考虑个加权值,不应该单纯地做平均数
  • 可以分析更多的信息,譬如
    • 按厂牌
    • 按年份
    • 按类型

分析

按参与演出片子数量来算,以下是数量最多的女优:

女优片子数量
波多野结衣130
佐佐木亚希110
吉泽明步84
水野朝阳70
麻里梨夏70
椎名空69
天海翼61
希崎杰西卡59
若菜奈央57
爱乃娜美54
古川伊织53
铃村爱里49
小岛南48
希岛爱理48
AIKA48
葵玲奈47
KMP成员47
上原亚衣46
波木遥46
蒂亚46
篠田步美44
荣川乃亚44
安部未华子44
希美真由44
PRESTIGE成员44
天使萌43
大槻响42
星野娜美42
迹美珠里42
香椎梨亚41
奥田咲41
川上奈奈美41
澁谷果歩41
冬月枫41
彩美旬果40
园田美樱40
葵S140
梦乃爱华39
京香julia39
长谷川留衣39
樱由罗39
宇都宫紫苑39
葵司38
向井蓝38
石原莉奈38
浅田结梨37
通野未帆37
由爱可奈37
樱井彩37

 

如大众点评、口碑网之类网站,岛国动作爱情片也会有网友的参与打分,这样比较好地反映大众的观点。

按网友的综合打分来算,以下是最后欢迎的女优:

女优分数
松田真夏9.2
松田美羽9.2
相川润9.15
北原るか8.9
白百合真白8.9
长谷川由香8.9
宮村ななこ8.9
川崎舞莉8.9
坂口あこ8.9
真島かおる8.9
仮名8.9
里中亜矢子8.9
山本菊恵8.9
早野いちか8.9
朝川奈穂8.9
城星凜8.9
羽奈美すず8.9
雨宮める8.9
平林あさみ8.9
佐山渚8.9
あすかみさき8.9
MISA8.9
花澤アン8.9
原羽瑠8.9
あゆみ翼8.9
宫咲羽音8.9
天野诗织8.9
柚木彩華8.9
松下光8.9
8.9
甲斐ミハル8.87
新城みなみ8.87
结城美佐8.85
鎌沢朋佳8.8
若宮未來8.8
桐山美步8.8
愛原りの8.8
艶堂しほり8.8
吉沢さりぃ8.8
平野里美8.8
双海ゆい8.8
石川琳8.8
武藤えり8.8
瀬戸愛莉8.8
秋月しずこ8.8
長野ゆり8.8
樱子8.8
未来りお8.8
乃木ちはる8.8
樱木英里奈8.8
天野弥生8.8
神崎莉乃8.8
美咲あいみ8.8
幸田李梨8.8
酒井あずさ8.8
愛乃まほろ8.8
花桃ひとみ8.8
西川紗菜8.8
一色美桜8.8
芦川芽依8.8
中西愛美8.8
優陽にこ8.8
潮崎米亚8.8
美咲ゆうら8.8
爱田奈奈8.8
宮藤まい8.8
あらがきりあ8.8
今野由美子8.8
朝倉ことみ8.8
河合心8.8
水星有贵8.8
北条桃香8.8
徕梦8.8
佐伯奈々8.8
星野景子8.7
鸣泽百合8.7
音羽ななみ8.7
要ユリア8.7
沢田桜8.7
星川麻紀8.7
中村幸子8.7
佐佐波莉乃8.7
合田柚奈8.7
高岡青葉8.7
真紀ナオミ8.7
8.7
杏璃さや8.7
桜井美幸8.7
喜山绘里香8.7
立花涼子8.7
菜菜美ねい8.7
藤季咲良8.7
板野有紀8.7
铃代绘奈8.7
南澤ゆりえ8.7
伊澄知世8.7
川越唯8.7
Runa8.7
響まい8.7
あかね8.7
ふわりゆうき8.7

第十讲-数据存储-基础

目录

这是爆栈之旅的1对1私人定制授课的第十讲,数据存储,视频+讲义+问答+测试+代码审查等等。

 

是否想技术水平快速提升?是否希望快速成为公司的技术骨干?

核心价值
  • 把我这10多年来所学到的知识、总结的经验、吸取的教训分享出来
  • 针对不同的学生量身定制规划学习成长路线、1对1个人指导、代码审阅等
  • 解答各种技术问题
  • 为公司提供技术解决方案

请查看本站右边的信息联系我。

版权所有

所有文章内容版权所有,任何形式的转发/使用都必须先征得本站书面同意。本站保留一切追究的权利。