如何成为优秀的程序员

崔宝秋,现任小米首席架构师、小米云平台负责人。1995年赴美留学,纽约州立大学石溪分校计算机科学系博士毕业,曾任IBM高级工程师和高级研发经理、雅虎搜索技术核心团队主任工程师、LinkedIn主任工程师,2012年回国加入小米科技。

image

2011年11月,当时雷总去硅谷,带了一个小米手机,给我解释了小米是一家什么样的公司:小米不仅仅是一家卖手机的公司,更多的是一家移动互联网公司。当他跟我讲了这个之后,我当时决定其实已经下了。

image

我是1987年读的大学,在读大学之前对计算机可以说是一窍不通的,唯一接触的都是在《中学生》杂志上面看到的一些BASIC语言写的小程序。对计算机的喜爱是从最开始的编程课开始的。

image

1994年8月份进入计算所开始接触了Email 电子邮件,然后就开始通过电子邮件联系学校。以前都是通过图书馆,查很多书、学校的简介,然后发纸质的航空信。这个Email在我当时看来是惊奇的。

image

很早我就觉得我将来一定要在工业界。我的梦想就是让自己的代码跑在每个人的电脑上

image

1995年到了美国,就觉得确实中美之间在计算机领域差别还是非常大……不是说我们离科技前沿有多远,而是说我们在不在那儿。

image

在美国,可以突然跟一些科技前沿的技术人员、研究人员、教授、学者有直接的接触,你做的事情自然而然就是前沿。

image

在2010年之前,中国的移动互联网已经在开始超车。到2012年开始,中国已经开始领先了。在这种时代的背景下,我觉得做移动互联网回到中国可能是我一个最好的选择。

image

4.1 每个程序员都该知道的知识 你好,我是陈皓,网名左耳朵耗子。

在整个为期一年的专栏内容中,我会逐步向你推荐一些有价值的内容,供你参考,这些内容有中文,有英文,也有视频,它们都是我认为对我非常有价值的信息,我也希望它们对你能有同样的帮助和启发。

今天,我为你推荐的5篇文章,它们分别是:

● Stack Overflow上推荐的一个经典书单; ● 美国某大学教授给计算机专业学生的一些建议,其中有很多的学习资源; ● LinkedIn的高效代码复查实践,很不错的方法,值得你一读; ● 一份关于程序语言和bug数相关的有趣的报告,可以让你对各种语言有所了解; ● 最后是一本关于C++性能优化的电子书。

每个程序员都应该要读的书

在Stack Overflow上有用户问了一个问题,大意是想让大家推荐一些每个程序员都应该阅读的最有影响力的图书。

虽然这个问题已经被关闭了,但这真是一个非常热门的话题。排在第一位的用户给出了一大串图书的列表,看上去着实吓人,不过都是一些相当经典相当有影响力的书,在这里我重新罗列一些我觉得你必须要看的。

● 《代码大全》 虽然这本书有点过时了,而且厚到可以垫显示器,但是这绝对是一本经典的书。 ● 《程序员修练之道》 这本书也是相当经典,我觉得就是你的指路明灯。 ● 《计算机的构造和解释》 经典中的经典,必读。 ● 《算法导论》 美国的本科生教材,这本书应该也是中国计算机学生的教材。 ● 《设计模式》 这本书是面向对象设计的经典书籍。 ● 《重构》 代码坏味道和相应代码的最佳实践。 ● 《人月神话》 这本书可能也有点过时了,但还是经典书。 ● 《代码整洁之道》 细节之处的效率,完美和简单。 ● 《Effective C++》/《More Effective C++》 C中两本经典得不能再经典的书。也许你觉得C复杂,但这两本书中带来对代码稳定性的探索方式让人受益,因为这种思维方式同样可以用在其它地方。以至于各种模仿者,比如《Effective Java》也是一本经典书。 ● 《Unix编程艺术》《Unix高级环境编程》也是相关的经典。

还有好多,我就不在这里一一列举了。你可以看看其它的答案,我发现自己虽然读过好多书,但同样还有好些书没有读过,这个问答对我也很有帮助。

每个搞计算机专业的学生应有的知识

What every computer science major should know,每个搞计算机专业的学生应有的知识。

本文作者马修·迈特(Matthew Might)是美国犹他大学计算机学院的副教授,2007年于佐治亚理工学院取得博士学位。计算机专业的课程繁多,而且随着时代的变化,科目的课程组成也在不断变化。

如果不经过思考,直接套用现有的计算机专业课程列表,则有可能忽略一些将来可能变得重要的知识点。为此,马修力求从四个方面来总结,得出这篇文章的内容。

  1. 要获得一份好工作,学生需要知道什么?
  2. 为了一辈子都有工作干,学生需要知道什么?
  3. 学生需要知道什么,才能进入研究生院?
  4. 学生需要知道什么,才能对社会有益?

这篇文章不仅仅对刚毕业的学生有用,对有工作经验的人同样有用,这里我把这篇文章的内容摘要如下。

首先,对于我们每个人来说,作品集(Portfolio)会比简历(Resume)更有参考意义。所以,在自己的简历中应该放上自己的一些项目经历,或是一些开源软件的贡献,或是你完成的软件的网址等。最好有一个自己的个人网址,上面有一些你做的事、自己的技能、经历,以及你的一些文章和思考会比简历更好。

其次,计算机专业工作者也要学会与人交流的技巧,包括如何写演示文稿,以及面对质疑时如何与人辩论的能力。

最后,他就各个方面展开计算机专业人士所需要的硬技能:工程类数学、Unix哲学和实践、系统管理、程序设计语言、离散数学、数据结构与算法、计算机体系结构、操作系统、网络、安全、密码学、软件测试、用户体验、可视化、并行计算、软件工程、形式化方法、图形学、机器人、人工智能、机器学习、数据库等等。详读本文可以了解计算机专业知识的全貌。

这篇文章的第三部分简直就是一个知识资源向导库,给出了各个技能的方向和关键知识点,你可以跟随着这篇文章里的相关链接学到很多东西。

LinkedIn高效的代码复查技巧

LinkedIn's Tips for Highly Effective Code Review,LinkedIn的高效代码复查技巧。

对于Code Review,我曾经写过一篇文章 《从Code Review谈如何做技术》,讲述了为什么Code Review是一件很重要事情。今天推荐的这篇文章是LinkedIn的相关实践。

这篇文章介绍了LinkedIn内部实践的Code Review形式。具体来说,LinkedIn的代码复查有以下几个特点。

● 从2011年开始,强制要求在团队成员之间做代码复查。Code Review带来的反馈意见让团队成员能够迅速提升自己的技能水平,这解决了LinkedIn各个团队近年来因迅速扩张带来的技能不足的问题。 ● 通过建立公司范围的Code Review工具,这就可以做跨团队的Code Review。既有利于消除bug,提升质量,也有利于不同团队之间经验互通。 ● Code Review的经验作为员工晋升的参考因素之一。 ● Code Review的一个难点是,Reviewer可能不了解某块代码修改的背景和目的。所以LinkedIn要求代码签入版本管理系统前,就对其做清晰的说明,以便复查者了解其目的,促进Review的进行。 我认为,这个方法实在太赞了。因为,我看到很多时候,Reviewer都会说不了解对方代码的背景或是代码量比较大而无法做Code Review,然而,他们却没有找到相应的方法解决这个问题。 LinkedIn对提交代码写说明文档这个思路是一个非常不错的方法,因为代码提交人写文档的过程其实也是重新梳理的过程。我的个人经验是,写文档的时候通常会发现自己把事儿干复杂了,应该把代码再简化一下,于是就会回头去改代码。是的,写文档就是在写代码。 ● 有些Code Review工具所允许给出的反馈只是代码怎样修改以变得更好,但长此以往会让人觉得复查提出的意见都表示原先的代码不够好。为了提高员工积极性,LinkedIn的代码复查工具允许提出“这段代码很棒”之类的话语,以便让好代码的作者得到鼓励。我认为,这个方法也很赞,正面鼓励的价值也不可小看。 ● 为Code Review的结果写出有目的性的注释。比如“消除重复代码”,“增加了测试覆盖率”,等等。长此以往也让团队的价值观得以明确。 ● Code Review中,不但要Review提交者的代码,还要Reivew提交者做过的测试。除了一些单元测试,还有一些可能是手动的测试。提交者最好列出所有测试过的案例。这样可以让Reviewer做出更多的测试建议,从而提高质量。 ● 对Code Review有明确的期望,不过分关注细枝末节,也不要炫技,而是对要Review的代码有一个明确的目标。

编程语言和代码质量的研究报告

A Large-Scale Study of Programming Languages and Code Quality in GitHub,编程语言和代码质量的研究报告。

这是一项有趣的研究。有四个人从GitHub上分析了728个项目,6300万行代码,近3万个提交人,150万次commits,以及17种编程语言(如下图所示),他们想找到编程语言对软件质量的影响。

然后,他们还对编程语言做了一个分类,想找到不同类型的编程语言的bug问题。如下图所示:

以及,他们还对这众多的开源软件做了个聚类,如下图:

对bug的类型也做了一个聚类,如下图:

其中分析的方法我不多说了。我们来看一下相关的结果。

首先,他们得出来的第一个结果是,从查看 bug fix的commits的次数情况来看,C、C++、Objective-C、PHP和Python中有很多很多的commits都是和bug fix相关的,而Clojure、Haskell、Ruby、Scala在bug fix的commits的数上明显要少很多。

下图是各个编程语言的bug情况。如果你看到是正数,说明高于平均水平,如果你看到是负数,则是低于平均水平。

第二个结论是,函数式编程语言的bug明显比大多数其它语言要好很多。有隐式类型转换的语言明显产生的bug数要比强类型的语言要少很多。函数式的静态类型的语言要比函数式的动态类型语言的程序出bug的可能性要小很多。

第三,研究者想搞清是否bug数会和软件的领域相关。比如,业务型、中间件型、框架、lib,或是数据库。研究表明,并没有什么相关性。下面这个图是各个语言在不同领域的bug率。

第四,研究人员想搞清楚bug的类型是否会和语言有关系。的确如此,bug的类型和语言是强相关性的。下图是各个语言在不同的bug类型的情况。如果你看到的是正数,说明高于平均水平,如果你看到的是负数,则是低于平均水平。

也许,这份报告可以在你评估编程语言时有一定的借鉴作用。

电子书:《C++软件性能优化》

Optimizing Software in C++ - Agner Fog - PDF,C++软件性能优化。

这本书是所有C++程序员都应该要读的一本书,它事无巨细地从语言层面、编译器层面、内存访问层面、多线程层面、CPU层面讲述了如何对软件性能调优。实在是一本经典的电子书。

Agner Fog还写了其它几本和性能调优相关的书,你可以到这个网址下载。

● Optimizing subroutines in assembly language: An optimization guide for x86 platforms ● The microarchitecture of Intel, AMD and VIA CPUs: An optimization guide for assembly programmers and compiler makers ● Instruction tables: Lists of instruction latencies, throughputs and micro-operation breakdowns for Intel, AMD and VIA CPUs ● Calling conventions for different C++ compilers and operating systems

我今天推荐的内容比较干,都需要慢慢吸收体会,当然最好是能到实践中用用,相信这样你会有更多的感悟和收获。另外,不知道你还对哪些方面的内容感兴趣,欢迎留言给我。我后面收集推荐内容的时候,会有意识地关注整理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/3363.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安全防御之入侵检测篇

目录 1.什么是IDS? 2.IDS和防火墙有什么不同?3.IDS的工作原理? 4.IDS的主要检测方法有哪些?请详细说明 5.IDS的部署方式有哪些? 6.IDS的签名是什么意思?签名过滤器有什么用?例外签名的配置作…

性能测试(三)----loadrunner的使用

一)Controller的使用: 1)在VUG中针对写好的脚本创建场景: 2)手动打开Controller进行脚本的添加并创建场景: 点击完成之后直接打开Controller所在的组件 3)针对场景来进行设置: Basic schedule:点击这个选项进行设置 可手动修改每个用户组的Quantity来修改并发用户总量 3.1)初始…

css绘制一个Pinia小菠萝

效果如下: pinia小菠萝分为头部和身体,头部三片叶子,菠萝为身体 头部 先绘制头部的盒子,将三片叶子至于头部盒子中 先绘制中间的叶子,利用border-radius实现叶子的效果,可以借助工具来快速实现圆角的预想…

ChatGPT常用开源项目汇总

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

基于jmeter+perfmon的稳定性测试记录

最近承接了项目中一些性能测试的任务,因此决定记录一下,将测试的过程和一些心得收录下来。 说起来性能测试算是软件测试行业内,有些特殊的部分。这部分的测试活动,与传统的测试任务差别是比较大的,也比较依赖工具&…

c++之模板入门详解(五千字长文详解)

c之模板入门详解 文章目录c之模板入门详解泛型编程函数模板函数模板概念函数模板格式模板的原理函数模板的实例化模板实例化的个数对于同不同类型的传参!如何处理这个问题呢?关于具体存在的函数和模板函数的优先级问题!类模板类模板的用法&am…

若依框架 --- ruoyi 表格的设置

表格 字典值转换 (1) 方式1:使用字典枚举的方式 var isDownload [[${dict.getType(YES_OR_NO)}]];{field : isDownload,title : 是否允许下载,formatter: function(value, row, index) {return $.table.selectDictLabel(isDownload, value);} }, (2) 方式2&…

Java正则表达式及Pattern与Matcher使用详解

文章目录一、正则表达式详解1、符号定义(1)基本书写符号(2)限定符(3)匹配字符集(4)分组构造(5)字符转义2、常用正则表达式举例3、Java中RegularExpressionVal…

flutter 输入时插入分隔符

每四位插入一个分隔符import package:flutter/services.dart;class DividerInputFormatter extends TextInputFormatter {final int rear; //第一个分割位数,后面分割位,,数final String pattern; //分割符DividerInputFormatter({this.rear 4, this.pattern });overrideTex…

【Linux】虚拟地址空间

进程地址空间一、引入二、虚拟地址与物理内存的联系三、为什么要有虚拟地址空间一、引入 对于C/C程序,我们眼中的内存是这样的: 我们利用这种对于与内存的理解看一下下面这段代码: 运行结果: 观察父子进程中 val 变量的值&…

uniapp中使用百度地图(初学者保姆式教学,持续更新)

uniapp中使用百度地图(保姆式教学,从零开始) 最近在写一个移动端的地图项目,也是首次完整的去了解百度地图api,这篇博客会手把手的教你如何使用百度地图api和一些常见问题,后续我也会继续更新完善此博客 1、百度地图api&#xf…

实验九 TSP问题

《算法设计与分析》实验报告 所在院系 计算机与信息工程学院 学生学号 学生姓名 年级专业 2020级计算机科学与技术 授课教师 彭绪富 学 期 2022-2023学年第一学期 提交时间 2022年10月26日 目 录 实验九-1:TSP问题 一、实验目的与要求 二…

html+css制作

<!DOCTYPE html> <html><head><meta charset"utf-8"><title>校园官网</title><style type"text/css">*{padding: 0;margin: 0;}#logo{width:30%;float: left;}.nav{width: 100%;height: 100px;background-color…

mybatis如何解析常用的标签

通过这三行就解析好了一个mybatis配置文件&#xff0c;我们看看如何工作的&#xff1f; String resource "mybatis-config.xml"; Reader reader Resources.getResourceAsReader(resource); SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().b…

【进阶C语言】qsort库函数(详解)

qsort库函数1. qsort到底是什么&#xff1f;2. qsort库函数的功能3. qosrt函数详解4. 冒泡排序的实现5. qsort库函数如何实现冒泡排序6. qsort库函数排序结构体数据7. 使用冒泡排序的思想来实现类似于qsort1. qsort到底是什么&#xff1f; qsort是C语言库函数里面的一种&#x…

【Flutter·学习实践·配置】认识配置文件pubspec.yaml

目录 简介 pubspec.yaml 添加Pub仓库 其他依赖方式 依赖本地包 依赖Git 简介 简单说就是包管理工具&#xff0c;类似于Android 提供了 Gradle 来管理依赖&#xff0c;iOS 用 Cocoapods 或 Carthage 来管理依赖&#xff0c;Node 中通过 npm 等。 让我们能很好的管理第三…

固定优先级仲裁器设计

前言仲裁器Arbiter是数字设计中非常常见的模块&#xff0c;应用也非常广泛。定义就是当有两个或两个以上的模块需要占用同一个资源的时候&#xff0c;我们需要由仲裁器arbiter来决定哪一个模块来占有这个资源。一般来说&#xff0c;提出占有资源的模块要产生一个请求(request)&…

电脑硬盘文件数据误删除/格式化为什么可以恢复? 怎么恢复?谈谈文件删除与恢复背后的原理

Hello 大家好&#xff0c; 我是元存储~ 主页&#xff1a;元存储的博客_CSDN博客 1. 硬盘数据丢失场景 我们在每天办公还是记录数据的时候&#xff0c;文件存储大多数都是通过硬盘进行存储的&#xff0c;因此&#xff0c;使用多了&#xff0c;各种问题就会出现&#xff0c;比如…

【C++初阶】五、内存管理

文章目录1. C/C内存分布2. C语言中动态内存管理3. C中动态内存管理方式new/delete操作内置类型new和delete操作自定义类型4.C和C在内存申请失败时处理方式的区别5. operator new与operator delete函数6. new和delete的实现原理内置类型自定义类型7. 定位new表达式(placement-ne…

【 Spark编程基础 】实验1

文章目录第1部分&#xff1a;虚拟机的准备工作1.1 下载安装虚拟机1.2 修改主机名1.3 主机ip映射安装SSH服务端SFTP连接&#xff0c;传输安装包安装Java环境第2部分 Hadoop安装2.1 安装Hadoop第3部分 配置集群环境第4部分 Spark安装第1部分&#xff1a;虚拟机的准备工作 1.1 下…