技术的学习和分享

焦虑

王四哥最近发的热点微博 https://www.weibo.com/6719268224/IcAby5Jwk ,大意就是大部分博客内容不堪入目,所以大家还是没折腾了。


我对这个不吐不快。


我之前写过一篇《.NET的前世、今生与将来》,在微信群发,一个技术群里有人说(大意):不是大牛就别写这样的文章了。我当时就怼(大意):“这样是扼杀技术发展”。因为.NET的生态在中国很差(起码在过去10多年里),我希望通过这篇文章让大家认识到不能刻舟求剑,.NET不再是你们想象中那样的只能在Windows上跑(各个操作平台都可以跑了),更加不是收费的(从第一天开始就是免费的),而且是全面开源了。


至今,我没有看见一篇文章能企及我这个文章的广度的。


一些网站,和一些大V,有利益关系,互相推文章。其中一些文章,简单的翻译或者片言只字,被追捧着高呼:真香。

自己解决不了问题,我们会搜索方案。网上确实充斥着质量参差不齐的资源,如果我们无法分别这到底是否适合我们的问题,那我们很大可能会掉坑里。譬如Stack Overflow,一些被标注为答案的,并不是最佳答案,甚至不是正确答案。

学习是有成本的,不仅仅是主动学习的过程需要时间和精力,做到深处,我们还需要为各种坑埋单。

所以,四哥的观点,我是理解的。

写文章分享技术

喜欢英语和在澳洲工作近10年,让我养成了看英文技术文章的习惯。很多时候,技术文档我是直接看的英文官网而不是翻译,因为翻译过程中可能出现的偏差会导致我折腾时间。


但是,我对国人的英文水平深有理解,所以,不够是翻译还是把英文文档看完理解后重新演绎(编著),都是可以理解的。


原博说的那位老师,他的文章我看了不少。他擅长对各种技术文章阅读理解后编著,这个我没有问题,支持推进技术的发展。譬如他写的数据库表连接各种情况(左右/内/全),传统文章都是用Venn diagram(维恩图),基本上就是2个圈圈,部分/完全的空心或实心相交。他的文章指出,可以用不同颜色的行列数据更加直观地表达数据关系。他是看了英文技术原文然后把原文的图片搬过来,然后部分内容重新组织了。其他文章有类似的情况。我每天保持阅读大量技术文章的习惯,看多了,就知道了。


技术是一个累加的过程。不同的人有不同的水平。不管文章写得多差,总会有读者获益。不能因为水平不够高,就不能、不应该写文章。不管是为了个人总结还是让新手入门。当然,我相信搞技术的,误人子弟不是写文章的初衷,我们能做的,就是写之前尽量多查一下官网原文。写出来后,读者的阅读本身就是一个勘误的过程。

专家、全才和层次

当然,跟四哥说的那样,很多人都是“码了后看”,然后就太监了。之前看见一个说法,互联网上,90%的人只看9%的人评论1%的人写内容。这个比较接近80/20法则。


能在某个领域有非常深的造诣,成为专家,那是属于少数。如果能在多个领域都成为专家,那是凤毛麟角。如果你告诉我某个人在所有技术领域都是专家,我觉得那是独角兽。


譬如,技术专家Z在Linux、分布式有非常深的行业经验,阅读了大量技术文档,总结出来写了一系列文章,这个我购买过并且细读了相当一部分的,质量是不错的,其他部分我粗略地看了因为我之前掌握了。


但是,对.NET、SQL Server、Azure等方面的技术,有不少技术专家写了不少优秀的文章。这个不是旗帜鲜明地反微软技术的专家会去写的。那你有什么理由不让别人去写这块的内容?

自由和能力

不同的水平看同一个事物有不同的理解。多年前我对数据库没有理解,那些窗口函数/行列变换让我抓狂。多年后,我对烂代码各种吐槽,因为我每天要给这些代码擦屁股。段位高了,自然很多事情都不入法眼,甚至嗤之以鼻。但这并不代表别人不能够和不应该继续修炼。


网上各种鸡汤,贩卖焦虑,譬如大龄码农被辞退、找不到工作、甚至跳楼之类的新闻,或多或少让大家不安。我反复强调过我对老油条的各种不满,学习应该是终身的,否则后辈追赶上来甚至超车,你要给年轻人汇报,心态难以端正。


所以,我的意思是:很大事情要分两面看,不要搞技术一言堂。大家都应该去写文章,目标是不断学习和提高技术,让文章质量越来越高。


如果别人让你别出声,让他们闭嘴和滚蛋。

版权所有

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

O/RM的优势、缺点和最佳实践

O/RM

Object Relational Mapping,对象关系映射,一般简写为O/RM,或者更常见的ORM,就是数据库里面的一条记录,映射到一个对象,记录里面的字段,成为对象的属性。这是面向对象的数据访问方式。

在没有O/RM之前,我们习惯使用代码生成器来根据表结构自动生成各种CRUD(增删查改)方法。但是,这只能满足简单的操作,当业务复杂起来,特别是关系型数据,这个方法捉襟见肘。

不同的技术栈有不同O/RM方案,譬如Python的SQLAlchemy、Java的JPA(Java Persistence API)这个O/RM标准接口的就有多个解决方案。.NET下有从Java的Hibernate移植过来的NHibernate、微软开源的Entity Framework(EF)、Dapper、PetaPoco等。说起Hibernate,几年前12306售票系统出现问题,说是用的Hibernate。

Jeff Atwood是计算机编程博客Coding Horror的博主。他共同创建了计算机编程问答网站Stack Overflow,并共同创建了Stack Exchange。他曾经说过“O/RM是计算机科学的越南战争”

优势

生产力的提高

  • 用更少的代码,简便地实现CRUD(增删查改)
  • 多表连接可以方便地使用对象关系方式访问因为是面向对象,编译时便可知道一些用纯SQL可能会遇到的拼写、语法错误。这个有点像TypeScript和JavaScript的关系
  • 在Visual Studio等IDE中,在进行调试的时候,方便地浏览关系型对象因为最终执行的SQL是自动生成的,所以不受代码风格约束,而且只要合理使用O/RM,类似SQL注入等容易在手写SQL遇到的,不是一个大问题
  • 因为数据抽象访问,所以带来了支持多种数据库的可能性,譬如从PostgreSQL切换到SQL Server

缓存:双刃剑

  • 优秀/流行的O/RM内置了对缓存的支持,这样可以减少重复的数据库访问
  • 但是,一些时候你忘记了刷新已经缓存了的对象,你将会遇到数据版本冲突问题(老数据覆盖了较新的数据),一般做法是在必要的地方都调用类似Refresh等方法来刷新,但这样比较蹩脚

缺点

性能约束

  • 初始化加载,视乎你使用Code-first、Model-first还是Database-first,背后在做大量的工作,确保模型映射和数据库架构一致。某司使用NHibernate,几百个model,每次初始化需要3-5分钟
  • N+1问题:父子表关系,映射/使用错误,可能会导致父表的每条记录都会在子表做一次查询,譬如父表有1000条记录,最终可能会产生1001条查询
  • 类似报表中使用的各种聚合、pivoting(行列转换)
  • 要达到理想的性能,你需要调整各种映射属性,甚至做所谓的hacking,譬如模型定义了一些子表关联,如果你不想获取,你可能需要把这些属性设置为空值,或者设置为延迟加载;如果你熟练掌握SQL, 你会发现手写SQL会来得容易很多
  • 批量数据处理:批量导入/更新、导出,真要使用,一般O/RM需要蹩脚的处理

高级功能的缺少/支持

  • 譬如游标、递归、特定类型(如自定义类型)的支持
  • 譬如SQL Server的OUTPUT等的支持
  • 复杂查询,或者一些窗口函数, O/RM要么不支持这意味着你必须传输额外的数据在业务层进行处理,要么会很别扭。这个时候,用存储过程就更加合理

维护的难度

O/RM一个重要的特性,也是必备,就是数据库和对象之间的映射,数据库表、字段的特性,譬如字段的最大长度、各种约束(最大、最小值、默认值等)、精度、外键等,都要一一定义,不管是通过类似Hibernate的XML还是Fluent Hibernate的面向对象方式,或者一些Model-first的通过特性(attribute)来实现。

O/RM的使用,会导致两套数据库结构,一套在数据库里面,一套在O/RM定义。当你需要改动结构,你需要实现迁移,譬如改改变了字段的名字、表名。

使用的成本

使用O/RM的一个目的是只需要关心业务,不需要放多少时间在SQL上面,但是,学习O/RM本身是需要时间的,而且,要用好O/RM,不可避免要学好SQL,所以这个学习时间可能是单纯学习SQL的两倍或者更多。

之前说生产力是O/RM的优势,但是这个是建里在你必须先把映射关系建立好的基础之上,这个过程视乎业务系统的复杂度,需时可能比较长

数据库的表结构很多时候无法和对象模型完整一致,导致了在使用过程中需要做手工的转换,模型也随之快速增大,增加了逻辑的复杂性

之前说O/RM可以切换数据库系统,但是当你把一个数据库系统真的用起来之后,你会发现,你很大机会需要用到数据库系统的一些特性,这是其它数据库系统没有的,那么,这个迁移将会很大的挑战性。越抽象,复杂度越高,成本也随着增加

最佳实践

如果你希望深入了解数据库访问、O/RM最佳实践,跟随有15年+经验的数据库专家手把手、全程实战、系统性地、快速学习和提高数据库开发技术,欢迎访问 DevYeah.com联系我们。

交互式学习平台

本文完整版本在Dev Yeah的交互式学习平台上,有兴趣的同学可以点击这里免费注册,马上免费试用Dev Yeah的各种技术教学视频!

每日技术精选

Dev Yeah推出全新服务:每日技术精选。

不同的技术人有不同的阅读/学习习惯,一些一天读几篇甚至多篇文章,但是:

  • 由于时间限制,花了时间阅读才发现要么文章质量不高或者晦涩难懂,不能高效地学习
  • 日积月累,之前看过喜欢的文章,现在找不回来了

Dev Yeah的每日技术精选,包括但不限于:业界新闻、新/优秀开源项目、优秀技术文章等。分类包括前端、后端、数据存储、安全、AI/大数据等

每天我们会重点对其中一篇内容进行精读概述,让大家能够更好地理解、掌握和提高技术水平。

点击这里免费注册,马上免费试用Dev Yeah的每日技术精选!

Dev Yeah 全栈课程

要系统、快速、全面提高您的技术水平吗?访问Dev Yeah了解我们提供的全栈(前端、后端、数据存储和必备等)Python数据科学课程!15+年全栈开发经验(Web前端、后端、数据库、必备等)的技术专家手把手、全程实战!

扫描下面的二维码加入Dev Yeah技术交流群

扫描下面的二维码联系Dev Yeah客服

版权所有

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

Dev Yeah全栈和数据科学课程

是否想系统性地学习和提高Web前端、后台和数据库等技术栈的水平和能力?想成为能力出众的全栈开发人员?希望了解Python、数据科学和分析?在掌握的技术之外,渴望学习一门新的语言/技术,譬如Clojure、Docker/kubernetes容器、AWS/Azure云平台开发? https://www.devyeah.com/

是否希望免费注册、免费试用相关课程?扫描二维码加入Dev Yeah学员群便获得!访问 https://www.devyeah.com/  扫描页面最下面的二维码加入技术群,和各位小伙伴分享、学习和提高技术!

我们通过在线互动直播、线下手把手培训和随时随地的视频回放3种方式为你提供全方位的贴心教学服务。

全程动手实战,提供最佳实践指导,在较短时间内全面提升你的技术深度、广度和自我学习能力,累计项目经验、充实履历,助你获得更好的工作机会,成长为优秀的全栈/数据科学工程师 https://www.devyeah.com/

免费注册和获取《Dev Yeah每日技术精选》:
https://www.devyeah.com/ile

Dev Yeah技术群

Dev Yeah客服

系统日志的最佳实践

级别

系统运行过程中,或多或少会产生不同级别的日志:详情、普通、严重、错误等。一般越严重/重要的,产生的数量越少,反之,越多。

在开发环境中,我们一般会启用最详细的级别,这样可以全程跟踪系统运行情况,在生产环境中,我们一般只打开严重/错误级别,因为这样才是我们感兴趣的。但是,但真的遇到严重问题的时候,我们不能定位具体问题,就可能要打开更详细的级别来辅助我们找到问题的根源。

记录/通知方式

一些公司仍然把所有日志写入文本文件,譬如Windows的IIS网络服务器的日志就是用的CSV格式。

稍好一点做法,是数据库表。但是日志数量不断增加,这些数据都存放在一个表里面,迟早也会遇到需要切分的问题,而且一般数据库的成本比磁盘文件要高,所以一般来说,生成环境只记录最关心的内容。

而且,因为日志有一个天生的特点,就是每天记录的产生都有一个时间戳,而且是随着时间变化不断变大。我们做查询的时候,一般是按照时间来排序,最常见的就是倒序,也就是最新的日志,我们最感兴趣。所以,日志在数据库中的存储,一般是按时间戳做聚集倒序索引。

当然还有更特别的,就是遇到严重/异常的时候,通过邮件发送,甚至短信通知运维。

切分方式

一般是按每天来切分存储,如果数据量很大,那颗粒度会更低,譬如每个小时等。也有按大小来切分的,譬如每10M生成一个文件。这些都是所谓的窗口大小,可以按时间、大小、地区、部门等等来切分。

查询统计

日志的记录,除了排除,我们来会用来做数据统计。

然而从不同纬度分析这些数据麻烦,譬如分布式系统哪个地方的哪个模块那些用户群只有特定问题等,而且一般不能实时。

Raygun.io这个云日志服务提供商满足以上需求,他们以前用的nodejs,后来改成asp.net core,性能提升了20倍。

如何设计最佳的日志系统

是否想掌握怎样实现搞性能的分布式系统开发和设计出高效的日志系统?

可以找我们Dev Yeah学习全栈课程!访问官网 DevYeah.com 帮助你快速成长为更优秀的软件工程师!

版权所有

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

如何不要成为被宠坏的开发人员

尊重劳动果实

不购买正版,在中国,是个常态,不管是知识产权,还是各种假冒伪劣山寨产品。而且这种行为,自然而然,大部分盗版使用者都不以为是。

譬如,在网上看见一本著名的收费书籍,搜索一下,直接下载pdf文件或者其它电子书格式,一下子省了几十块了。

更有甚者,把这些盗版传播,甚至转手卖钱。相信各位作者都对这些行为非常反感。

这些从事创建发明行业的开发人员,自己不尊重别人的劳动成果,还能指望别人尊重自己的产品吗?换位思考一下,是否希望别人尊重自己的劳动果实,是不?

免费与付费

因为习惯了免费东西,一听说某种产品/服务要收费,一些开发人员会找出各种不愿意付费的理由:

  • 网上多的是免费的资源,你凭什么要收费?!
  • 你这个服务收费太贵了,难道就不能便宜些吗?

如果每个消费者都抱着这种心态,那会扼杀创新,阻碍技术的发展。

一些开发人员加入某个付费服务的技术群,看见服务提供商发产品的相关介绍,直接扔一句:”全是广告,退群了”。

我想问3个问题:

  • 首先,请问你加入这个群的目的是什么?
  • 其次,请问你加入这个群多久,观察了多久?
  • 最后,请问你是否参与过讨论,做个任何咨询?

举个简单例子:你花了相当的时间和精力研究出来的东西,有一定的经济价值,陌生人一上来就说:你要把这个免费公开,让我来享受一下。你的实际行动会是什么?

如果你觉得别人提供的服务没有价值,不值得花钱,请你自己慢慢学习钻研,看看你需要花多少时间和精力才能掌握你需要的技术和达到你希望的水平。

或许,你会觉得,我还年轻,有的是时间,反正我也不大着急。

然而,最佳时机是10年前,其次是现在。合适的服务,可以帮助你快速掌握和提高技术水平, 让你在相对较短的时间内获得最大的收益。

学习能力

相当部分开发人员是伸手党,要么微博私信,要么微信加了好友,直接问技术问题,基本礼貌都没有。而且部分还是连问问题都不会的,譬如:

  • 上来就扔一句话:“美国工作好找吗?”首先,你自己做什么,擅长什么技术,目前什么水平,要找什么样的工作,待遇要求多少,等等都没有说。基本上就是让你“阐述一下人类的未来发展”。
  • 问技术问题,背景需求等等都不讲一下,往往经过分析之后,发现他们问的问题都是错的,或者方向是错的。

换位思考一下吧。如果你被别人问这种问题,你怎么回答?如果不能,那你为什么那样提问?

部分开发人员没有系统地学过软件开发,也没有很好的学习能力,连研究技术问题的能力都是比较弱的,譬如搜索,一般是搬运stackoverflow的答案,然而,一些SO的答案并不是最佳答案,部分连答案都不是正确的答案。

学习能力,不仅仅是钻研具体函数怎么实现/调用的能力,更多是思考能力。

今天在微博看见一个观点,大概意思软件开发人员发展路线分几个阶段:

  1. 第一级是技术输出
  2. 第二级是经验输出
  3. 第三级是思路输出
  4. 第四级是决策输出

那些被宠坏的开发人员,往往在第一级挣扎。

对内容的正确与否、质量高低、适用性的判断能力也很重要。

一些开发人员把对掌握某种技术说需要的时间和精力看得比较简单,以为根据一些关键字搜索出几篇文章,然后奉为真理,应用到产品中便可。

一般是掉到坑里,挣扎好久,爬出来了 ,这是相当可怕的 。希望他们能吃一堑长一智。

合适的工作内容更重要

首先,先看看你自己是否符合技术范围、水平、工作合规性(签证等)等要求,再问问工作要求细节,最后问工资也不迟。

我遇到过, 我发布开发人员的招聘信息 ,第一件事情是问:待遇多少钱?

给更多,欲望更大,时刻想着找下一家给更多的钱,每间公司都是踏脚石,这样不利于自己的职业生涯的发展。

有人说:“自己能力没达到,到时候面试被刷下来,继续努力呗”,但这完全是浪费双方的时间。

合适的工作环境和有挑战的内容,才有助于你的职业生涯的发展,这些才应该是你注重的地方。

而且,面试是双向的,如果你只问工资,人家只问你年龄,你觉得靠谱吗?

态度决定很多事情

一个网上的博客文章,是一个从事软件开发的学生,写的总结报告,里面有一句话:“我的疑问是既然我们是一个团队,有领导带领,那我们为什么要和领导承担同样的压力和责任,如果说我们是创业团队,大家用敏捷流程无疑会是不错的选择,但是既然是在公司,既然有领导,他领的工资还比我多,那我们又应该从哪儿去寻求动力与激情去承担这些责任呢?”

一般开发团队有各自的分工,但很多时候一个开发人员需求分析、设计、开发、测试、写文档、发布、运维、装电脑等都得做,这些活(压力/责任)你可以不去做,但是总得有人去做,也总会有别人去做(你失业了)。

而且,责任多,是好事,你有了更多的学习机会。趁年轻,多学习,不要怕吃亏吃苦。

你希望做一个小小的螺丝钉,还是希望能发挥所长,做出成绩,产生更大的影响,这是你的选择权。

你需要知道的是你的职业生涯目标,3-5年后,你会成为怎样的开发人员,这些你能决定的,你不去承担工作范围内合理的压力和责任,那很大可能多年后,你还是会碌碌无为。

而且,合格的领导,他们拿比你高的工资,原因很多,譬如:

  • 他们经验比你丰富,在遇到问题时,他们的决策可以更好地提出方案/解决问题
  • 他们需要负责更多的事情,譬如团队之间、公司和客户之间的交流、谈判等。

学习技术的痛点

互联网每时每刻都在产生大量的技术资源,我们面对这样海量的信息无所适从:

1. 究竟学哪些新技术?

2. 究竟哪些资源质量高?

3. 究竟我们怎样才会不走弯路?

4. 究竟最低成本的学习办法是什么?

5. 究竟我怎样才能用最短的时间提升自己的技术深度和广度?

6. 究竟我怎样才能用最快的速度提升自身价值?

如果你觉得自己的时间不值钱,那当然可以慢慢消耗时光。然而,对大部分人来说,最值钱的,是时间,而且这个数字在不断减少,而且速度惊人。

拿22岁毕业,60岁退休来说,你的工作人生只有短短的13870天。没错,就13870天!如果一周按5天算,那只有9907天,1万天都不够。

那么,你是否愿意投入一些时间、花一些钱去学付费服务,快速提高技术水平,从而能加薪升职、找到更好的工作呢?

版权所有

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

爆栈思想 – 为什么别人升职比我快,赚钱比我多?

机会

在上一篇文章 爆栈思想 – 开发人员的层次和水平发表之后,反响不小。

有网友说:

你所提到的这些技术,越往上越难有机会让一般的工程师接触到。为什么呢?一方面,很多时候,问题发生在生产环境或者CI/CD的pipeline上,online fix 问题,风险高不好操作而且一般都是level 很高的工程师主导。另一方面,就算这类问题在系统设计期被发现,这本身就证明了那个技术负责人团队很牛,要查出、测试这样的问题,需要大量的测试数据,写benchmark,模拟真实业务场景。能参与解决这些问题,不但需要你技术上本来就处在比较有影响力的角色上(credential),还需要你有很强的组织协调能力(你需要别人的support来你解决一些非核心问题)

所以,你能掌握这些很不容易。这要放在我们公司,至少也是principal 或者 senior principal 这个级别了。。。

 

首先,需要时间,一些开发人员很浮躁,缺乏充足的经验,却动辄自称精通。其次,还是看动力。修行在个人,见缝插针,像海绵那样去吸收。学习的机会如果都在被动地等,那是和别人主动地去学不一样。

一些同学技术修行还没达到天花板,就已经在说/想:反正到了天花板,领导还不是我,他们还比我们年轻,技术没我们好,但却做我们领导,所以我们努力来干嘛?

机会是需要创造的,我来澳洲之前在中国已经做到部门小头目,来到澳洲重新做起,花了4年当上部门经理,现在是Head of Architecture,虽然只是给名字,但起码说明坚持不懈的努力是有回报的。

 

 

想知道为什么我这么多年来能掌握那么多种技术,不仅仅是广度,还有深度,达到我所说的“爆栈”吗?

在《爆栈之旅》,我根据大家都实际情况、水平、方向等规划职业路径,手把手带你做实战的项目,用最高效的办法达到你想要的高度。

爆栈之旅

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

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

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

版权所有

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

爆栈思想 – 开发人员的层次和水平

开发的层次

极限编程之父Kent Beck曾经说过,软件开发的过程,就是:Make it work, make it right, make it fast。其实就像是敏捷开发,先是让软件能跑起来,然后把功能和实现都做对,最后才考虑优化。

Image result for kent beck make it work

 

过早的优化

软件开发大师Donald Knuth曾经说过的一句名言:过早的优化是罪恶之源。

Image result for premature optimization is the root of all evil

 

软件开发里面有魔鬼

王四哥个祖师爷、计算机开发大师Tony Hoare更尖锐地指出:过早的优化是软件开发的罪恶之源。

Image result for premature optimization is the root of all evil

王四哥曾经说过,一些开发人员把上述名言作为借口不做合适的设计,写垃圾软件。

 

开发人员的层次

古代,人分三六九等。曾经有人把人分成七层:奴、徒、工、匠、家、师、圣,并做了如下解释:

  • 奴:指非自愿和靠人监督的人。
  • 徒:指能力不足,又肯自愿学习的人。
  • 工:就是老老实实,按规矩做事的人。
  • 匠:指精通一门技艺或手艺,靠劳动生存的人。
  • 师:就是掌握了一些规矩,又能将规律传授给他人的人。
  • 家:有固定的信念,让别人生活得更好的人。
  • 圣:精通事理,通达万物,大公无私,为民立命的人。

现代社会,各个岗位都分层次、级别,我在之前多篇文章中指出,开发人员也分多个级别。我们常自我调侃说自己是“码农”,还有一些贬义的更低层次的,被称作“码奴”,当然还有不能登大雅之堂的,如“码畜”.

如果简单粗暴地分,我们可以分为3个级别:

  1. 能写软件
  2. 会写好软件
  3. 会把软件优化好

我多次指出,为了提高面试命中率,太多开发人员把不想称的精通写入了简历。实际上,大部分开发人员只达到“能写软件”这个级别,一部分能通过多年的努力达到“会写好软件”这个层次,极少数的开发人员能成为塔尖的“会把软件优化好”。这个优化,不是贬义的提前优化。

我在多篇文章和多个场合,反复吐槽各种不合格的开发人员常犯的错误,细到语言特性,大到系统架构。然而,吐槽是一回事,现实是残酷的,很多公司对这些质量问题没有特别的追求,开发人员也就无欲无求,多年后,带新人,把这些坏态度像病毒那样传下去。

拿数据库系统SQL Server举个例子:

  1. 懂CRUD,能写个业务模块的那叫“会做SQL Server数据库开发”
  2. 理解SQL Server各方面的功能,优缺点,坑,怎么在不同的场景如大量并发 vs 低并发大批量数据处理 用不同的解决方案,那叫“会写好的SQL Server系统”
  3. 深入掌握SQL Server的原理、机制和上限,掌握数百种性能监控指标、数百种安全漏洞防御措施、使用多种方法全方位地进行优化改造,那叫“能把SQL Server优化好”。

再深入一点,那就是充分利用SQL Server支持的特性,实现高可用性、安全、横向扩容的方案。

所以,业界中,真正出色的开发人员,是极少数的。

 

 

想知道为什么我这么多年来能掌握那么多种技术,不仅仅是广度,还有深度,达到我所说的“爆栈”吗?

在《爆栈之旅》,我根据大家都实际情况、水平、方向等规划职业路径,手把手带你做实战的项目,用最高效的办法达到你想要的高度。

爆栈之旅

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

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

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

版权所有

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

爆栈思想 – 如何强迫开发人员提高代码质量

劳逸结合

在微博看见有同学说花了不少时间修警告,修上瘾了,不想回家吃饭。首先,这位同学,身体健康是自己的,热爱工作也好,给老板卖命也好,也得work life balance,劳逸结合。

警告有什么不好?

首先,为什么要把警告给修了呢?一般来说,警告来自编译器,分几种情况:

  • 编译器认为有潜在错误的可能,譬如类型转换丢失数据等
  • 冗余代码,譬如多余的变量等,在C#中经常遇到的是try/catch(Exception ex),这个ex异常变量很多开发人员都不会使用,所以就成了警告。

这些警告,说白了,首先是碍眼、闹心,像我这种推崇代码质量追求性能的有代码洁癖的开发人员,我就不能容忍警告。

然而,代码洁癖不是最重要的,如果因为像long <-> int之间类型转换过程中导致数据丢失,那这种警告必须修复,因为错误到了生产环境后的修复成本会高很多。

怎么修复警告?

有同学说:把警告屏蔽掉,世界就安静了,problem solved!但是,这种掩耳盗铃的伎俩迟早会导致麻烦找上门来。

我曾经在一个公司做过,其主系统几百万行代码而已,几百个警告,修了我好久,都修好了,一段时间之后,发现又有几十个,身心俱疲。这显然是开发人员完全不理解为什么警告要修复,也不理解怎么避免警告。

在另外一家公司,2200万行代码,70万个单元/整合测试,没有一个警告,因为任何警告都被视为错误无法编译通过。当然,开发人员的平均水平高也是很重要的一个原因。

所以,要么狠下心把警告视为错误让开发人员老实修复,要么培养提高他们的素质。不过,根据我10多年的开发经验,不能相信开发人员的自律,必须两手都要抓,两手都要硬,因为你永远不知道哪天被猪队友坑了。在这点上,Visual Studio有“把警告视为错误”的选项。

Visual Studio大法好,你值得拥有!

怎样强迫开发人员提供技术水平?

在某司呆过,他们自己从头实现了一整套的分布式编译、测试系统,没错,简单来说他们实现了自己的Team City。这套重新发明的轮子有很强悍的地方,譬如几百种的非常严格、全面的代码风格、质量控制规则,你想到和没想到的都有,譬如,多一个空格都会被视为错误无法编译通过,一般新开发人员来到,会被逼疯。但是,这样下来,整个系统看起来都像是同一个开发人员写出来的。

当然,大部分公司都没有这样的资源去做这样的一套系统,但是,我们完全可以引入一些比较严格的自动化代码质量控制规则(即便通过插件)。

关于被动、主动的层次,英文里面是:passive(被动)-> responsive (反应)  -> active (主动) -> proactive (积极) -> pre-emptive

在代码质量控制上,我们也应该用各种规则防止被坑爹。

 

想知道为什么我这么多年来能掌握那么多种技术,不仅仅是广度,还有深度,达到我所说的“爆栈”吗?

在《爆栈之旅》,我根据大家都实际情况、水平、方向等规划职业路径,手把手带你做实战的项目,用最高效的办法达到你想要的高度。

爆栈之旅

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

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

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

版权所有

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

爆栈思想 – 我究竟值多少钱?

价格和价值

首先,我们需要明白,价格不一定等于价值。价格就是大家去购物看见商品上的那个标价,但是价值往往是另外一回事。

我究竟值多少钱?

我经常和那些找工作的朋友说,对薪资要求,一般有3种心态:

  • 我宁愿现在要求少一点,先把offer拿到手,进去之后再好好表现争取升职、加薪
  • 我会看市场,结合自身实际情况,合理地要求
  • 我会尽量抬高要求,譬如我现在拿10万,我会更下一家公司说我现在拿15万,这样他们为了追逐我,就一定会给15万以上

我多次提及,一个公司养一个员工,远远不止工资这么多,譬如你拿工资10万,加上各种税、年假病假、招聘费用、资源(工位摊分成等等)、培训,实际上公司要为你付出15万甚至更多,而且商家都是逐利的,公司会从你获取20万甚至更多,这意味着,你要求10万,公司会尽可能地榨取你起码20万的付出。

简单地来说,没有免费的午餐,你获得多少,付出的必须更多。

我没有跟进中国的市场,我只知道BAT等互联网公司哄抬了开发人员的身价,动辄几十万、上百万工资加一大票的期权股份。

单纯澳洲来说:

  • 人年平均收入大概是7万多(这几年的大概数字,没有跟进最新的)
  • 悉尼的开发人员(笼统地平均,忽略前端、后端、数据、爆栈的区别)
    • 初级开发人员(0 – 3年经验):5-7万
    • 中级:8-10万
    • 高级:11-13万
    • 小头目/架构师:14-16万
    • ….如此类推

 

想知道为什么我这么多年来能掌握那么多种技术,不仅仅是广度,还有深度,达到我所说的“爆栈”吗?

在《爆栈之旅》,我根据大家都实际情况、水平、方向等规划职业路径,手把手带你做实战的项目,用最高效的办法达到你想要的高度。

爆栈之旅

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

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

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

版权所有

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

爆栈思想 – 偏好与偏见

偏好

相比英剧,我更喜欢美剧。相比现代流行歌曲,我更喜欢70年代-90年代的经典爱情歌曲。这是偏好。

偏见

偏好和偏见还是有很大区别的。譬如:

  • 一些开发技术文章,同类对比的时候,只字不提C井,尽管这些文章中的截图C井很明显地出现在突出的位置(排名很高)
  • 比较cloud服务的时候说Google的、IBM的、AWS就是不说排名第二的Azure
  • 开源领域不谈微软的贡献,又譬如宁愿离开GitHub去gitlab
  • 《最强大脑》那个组合拆了的汉字的游戏,用的Hololens,就没说微软的

当然,你们可以说是这是选择自由。

很多时候,这些偏见来源于坐井观天,他们对微软的认识还停留在10年前,现在:

  • .NET可以在各个平台上跑,完全开源,而且性能(语言+平台)在各个性能比较网站上的评分追平甚至超过Java,远远抛离你们想象中的那些主流解决方案
  • SQL Server不仅能在Windows上跑,而且还能在Linux上跑
  • Visual Studio不仅仅是给Windows开发者做桌面程序的,现在MacOS和Linux越来越多开发人员拥抱Visual Studio Code了
  • 大家常用的SO(StackOverflow),使用了大量微软的技术,包括C#和ASP.NET

 

想知道为什么我这么多年来能掌握那么多种技术,不仅仅是广度,还有深度,达到我所说的“爆栈”吗?

在《爆栈之旅》,我根据大家都实际情况、水平、方向等规划职业路径,手把手带你做实战的项目,用最高效的办法达到你想要的高度。

爆栈之旅

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

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

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

版权所有

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