认识代码之前,请先认识你自己 |《编程人生》

news2024/11/25 17:19:58

这是我的湛庐课程《给技术人的职场突围课》 (链接) 的一部分。 这篇文章也是 IT 女神征文活动 的一部分。

《编程人生》是一本优秀程序员的采访集,里面记录了15位世界级编程大师的故事。

我在 发刊词 里面说过,在这个书单课里,我会通过对四种关系的梳理,帮你系统思考自己的职业发展。而在这几种关系中,最基本的一个,就是要处理好“我和自己的关系”,更好地认识自己。

女程序员先驱( IT女神)

在这里插入图片描述

我之所以选《编程人生》 (原名:Coders at Work)这本书,就是想通过书里这些优秀的软件工程师、科学家的例子,“以人为镜”,从比较务实的层面,和你聊聊怎么去清晰地认知自己,发掘自己的性格特点,选择适合的职业发展路径。我也写了一篇这本书的读后感。

《编程人生》这本书采访了 15 位优秀的程序员,我不能一一介绍,那从什么人开始介绍呢? 编程可以说是一个工程,是一门艺术,也可以说一门手艺。 作为一个行业,我们现在的很多习以为常的规矩和做法,是怎么来的?这个行业的先驱们是在什么样的条件下创立这个行业的各种规范的?我们叫他们‘祖师爷’,或者在我们这一集里面,叫她们‘祖师奶奶’。 我想从最年长的程序员说起,在这本书里,就是 Fran Allen。

(注:我搬运了几张网上的照片,例如https://blog.csdn.net/rx3oyuyi/article/details/88342230)

Fran Allen

Fran 1932 年出生,2020 年去世,她是美国早期计算机程序员和科学家。这样一位“元老”级别的程序员,她的工作和我们现在的计算机、软件工程发展有什么直接关联么?

答案是,不仅有,而且有很大的关系。她的研究对于现在Java 等语言的即时编译 (Just In Time, JIT)技术起了奠基作用。 2002年时,Fran Allen 还凭借 “在优化编译器技术的理论和实践中的开拓性贡献” 获得了图灵奖。 她是七十多位获得者中仅有的两位女性之一。

Fran本人并不是计算机专业毕业的,她有数学的本科学位,还辅修物理学课程,除此之外,她只是在读数学硕士学位的时候,选修过计算机技术的课程。

她毕业时,正赶上 IBM 招聘,因为觉得计算机很有趣,加上着急要还助学贷款,所以她就填了申请,此后一段时间,其他的工作机会迟迟没有出现,她就答应了 IBM 的 offer。

她在1957 年加入 IBM ,开始了自己的程序员生涯,一直在 IBM 工作了 45年,直到退休。作为一个并非科班出身的人,Fran是怎么学习计算机技术呢? 是像现在许多人一样,去市面上找一个培训学校参加培训么?显然不可能,因为那时候计算机科学还算是一个非常前沿的学科。

Fran的方法是边做边学。她在工作中,会通过研究已有的代码实例来学习编程技巧,或者是新的编程语言。

对于工作,她十分投入,这也是她日后事业中成功的重要原因之一。

她曾经说:“最令人陶醉的事情是阅读源代码,在我的记忆中,那些代码真是写得优雅无比,我时常沉醉其中,感叹设计的精巧。” 注意:她在这里说的源代码,其实是汇编代码。

除此之外,她在职场的经历,也为女性在IT行业的成长提供了一个很好的参照。

Fran曾经领导过一个重要的项目,项目中有位男同事身材魁梧,不苟言笑,有时还有些令人望而生畏,他喜欢通宵工作。

有一天早上,这位男同事走进办公室后,径直将一份厚厚的调试代码清单甩在了 Fran 的办公桌上。他指着打印信息列表中的某个细节问“你为什么要设置这一位?” 原来他一整夜都盯着这个犯愁,百思不得其解。 所以早上非常恼怒地质问 Fran。

听到这儿,我想请你来设想一下,如果你是Fran,早上刚一上班,一个身材魁梧不苟言笑的同事就跑过来指责你的程序中的细节问题。你会怎么办?

或许有人直接就怒了,或者害怕了, 但 Fran 非常了解这个程序,而且,她也具备足够的耐心,足够的冷静,所以她很平静地向对方解释了技术原因,并指出 bug 不在这里,而是在另一个地方。最后,这个小插曲得到了很好的解决。

Fran 的洞察力从哪里来,我想很大的部分是来自于长期深入的实践。

代码的世界有很多规律,外人看起来眼花缭乱的代码和各种日志信息,在有洞察力的人看来,其实也很有规律。 比如我听到过一个程序员高手的故事:某个程序输出的日志信息从编号1开始,一直到了 1048576 往后就没有了。这位高手看到后就说:为什么这个数这么整齐? 他旁边的程序员迷惑说,1048576 这个数有什么整齐的?

你能猜到这个数为什么整齐吗?答案就是 1048576 = 1024 * 1024, 也就说,1048576是 【一兆】的实际数值,出现这个数值之后,就说明某个容量为【一兆】的数组满了。

这个不是要背数字,然后应付填空题的知识,而是在实践中培养出来的洞察力。 我也碰到一些学生,很喜欢考证书。我个人认为,这种“证书”绝大部分考验的是静态的知识点,是实践技能的基础,但不是实践技能。 而且我不知道他是考前一周临阵磨枪背书考过的,还是自己平时就掌握这些技能,不用背书就能考过的。 相比之下,我更看重一个人的实际项目,例如,写博客,自己的开源代码,因为你可以看到技能积累的过程。一个写了100 篇博客,1万行代码,他是在几年内持续努力创作的,这个创作历程是公开的,不断改进的,这个证明远远胜于一个华丽的证书。

在IT行业,Fran Allen本身就是一个先驱,她用自己的实力和影响力,让更多的女性参与到这个行业当中,在她的团队中,也有不少女性的身影。

为什么我今天特别想来和你聊聊计算机行业的女性先驱呢?因为我和一些人谈起软件工程师这个职业,大家的印象是这是一个男性占统治地位的行业,女生要进入,似乎是要追赶男同学的样子。 其实,计算机科学早期发展历史中,女性发挥了很大的作用。

Ada Lovelace

或许很多人不知道,历史上的第一位程序员,就是一位女性,她叫Ada Lovelace ,是英国著名诗人乔治·拜伦的女儿,在母亲的鼓励下,阿达从小就喜欢数学,在1842年与1843年其间,Ada为发明家巴贝奇(Babbage)发明的分析机编写算法,她详细说明用计算机进行数学的运算方式,这样的描述,被认为是世界上第一个计算机程序;她还提出了循环等编程的基本概念。 她曾经对计算机做了预言,说“这个机器未来可以用来排版,编曲或是各种更复杂的用途”。

Grace Hopper

如果说Ada作为“程序员”并没有一个现代的计算机作为基础来编程,那么,在一百年后,1944年,第一个能实际运行并被编程的计算机 Mark I 在美国哈佛大学诞生,时年三十七岁的格蕾丝·霍珀(Grace Hopper)女士就是它的第三个程序员,她和她的团队在Mark I 上实现了100年前阿达提出的循环,子程序,还有其他现代编程的概念和实践。 例如“回滚机制”,让出问题的程序能返回到一个出问题之前的状态,这种实践在现在的互联网公司的运维体系中还在运行。

在这里插入图片描述

那年的秋天,她们的工作吸引了另一个数学家和计算机科学家冯 · 诺依曼的注意。 在研究了 Mark I 和另一个早期计算机 ENIAC 的技术和架构的特点后,冯 · 诺依曼在第二年提出了划时代的 “冯·诺依曼体系”,奠定了现代计算机的体系机构的基础。 根据霍珀的回忆,当时大部分的计算机研究都是在美国军方的资助下工作,对于公开发表文章都有很多限制。冯 · 诺依曼的文章是建立在这些一线程序员和研究员的工作之上的第一个公开发表的文献。

这里还有一个有趣的小插曲,我想你可能也听说过,就是霍珀在软件设计领域的第一项重大“发明”,是创造出了一个著名的计算机术语——“bug”。

1946年,她在发生故障的MarkⅡ计算机的 继电器触点 里,找到了一只被夹扁的小飞蛾,正是这只小虫子“卡”住了机器的运行。霍珀顺手将飞蛾夹在工作笔记里,并记录下这是一个真正的“bug”。后来这演变成计算机行业的专业术语。我们现在在网上,还可以查到这个最早“bug”的照片。

虽然现代电脑和飞蛾再也没有什么关系了,大家还是习惯地把排除程序故障叫做Debug(除虫)。

在早期的工作中,大家注意到一个问题。计算机代码,是给计算机读的,还是给人读的? 在计算机的早期,计算机的指令都是用二进制或者八进制的数字表示的。机器只认识这些数字,所以对于机器来说,挺方便的。 霍珀和其他程序员在实践中发现,程序员要花很多时间来记忆,修改,和讨论程序,一行一行的数字,并不利于人类设计,改进和交流程序,于是,霍珀和她的团队做了一系列的改进:

  • 第一,用英语字母来表示计算机指令,这样程序员就能方便地阅读和理解。
  • 第二,她也是第一个在源程序上写注释的程序员,这个成为了现在计算机编程的规定动作。
  • 第三,“一图胜千言”,她们发明了流程图 (Flow Chart),使用矩形来代表操作,使用菱形来代表选择,用线来表示程序的状态。就是从1940年代末开始的。一直到 70 多年后的今天,初学者还是用流程图来帮助设计和理解程序。

沿着 "让计算机程序容易写,容易理解” 的思路, 在1950年代末,霍珀还领导设计了现代编程语言 COBOL, 这个基于英语的计算机语言广泛地用于商业领域。 当时的计算机存储器非常贵,为了节省空间,COBOL 语言用六位字符来存储日期, 即年,月, 日各两位。 过了近四十年,世界上还有很多 COBOL 语言写的程序在运行,但是随着 2000 年的到来,用两位数记录的‘年’会变成 00, 这样就和 1900 年分不清了。这就是著名的 ‘千年虫’问题,这也从一个侧面说明了她设计的这个语言的长寿和应用广泛。

讲到这儿,有听众会问,这是不是有意要推崇女性的贡献呢?其实这个行业在早期发展的时候,没有人深入考虑过IT行业有多大的前景,在选择的时候,能干活就行,所以不管是男生女生,能解决问题就好,从我自身的经历来看,在计算机领域做出优异的成绩,和性别没有什么关系。

IT 行业提供了特别广泛的机会,各种不同的性格特点的人,都能找到自己的发挥空间。而且程序写出来之后,是没有性别的,大家只能看见程序的正确性、稳定性,所以只要技术过硬,无论男女,无论性格怎么样,都可能取得成功。

当然我在这儿说的成功,不是要给你灌鸡汤,我们总说:“这个世界上只有一种成功,就是以自己喜欢的方式过一生。”例如,我喜欢热情,不拘一格的生活方式,这没问题。但是,我们并不是自己性格的奴隶,不拘一格并不是 “由着自己的性子”。

Silvia

我想起一个同事,我的一个经理 Silvia (西尔维亚)。 她是从巴西来到美国微软公司工作的,她有南美女性的那种外向的热情性格,但是工作非常细心。 例如,我们软件工程师经常签入代码,很容易导致在主分支上的代码编译不过。我自己也曾犯过这样的错误。 在微软团队里面,如果你的代码签入导致了主分支的错误,你要去做 Build Master ,又叫“构建大师”,就是在本职工作之外,处理很多和代码构建相关的工作,直到下一个犯错误的人出现。 但是西尔维亚在微软作为一个资深的开发人员,就是没有犯过一次错误,没有做过一次 Build Master。 在工作之余聚会聊天的时候,我们都非常佩服她。

总结这一讲,我们讲了计算机软件行业几位老前辈的故事。 回到我们故事的主人公,我们有这样的问题:

如果你获得了数学系的博士,并且是大学里受欢迎的数学讲师了,就像我们前面说的格蕾丝 · 霍珀那样。 但是你的工作需要你学全新的硬件,和一个全新的“编程”的东西,你会怎么看这个机会?怎么选择?

如果刚一上班,一个身材魁梧不苟言笑的同事就跑过来指责你的工作中的问题。你会怎么办?

欢迎你在评论区分享你的见解。

这是我的湛庐课程《给技术人的职场突围课》 (链接) 的一部分。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何有效地降低软件开发风险?

1、科学分析风险 高风险自动预警 一般对风险进行科学分析,主要从3个维度进行划分:影响的严重性、发生的可能性、产生的影响性。 根据风险对项目的影响程度,从3个维度将其划分5个等级:很低、比较低、中等、比较高、很高。这样我们能…

react router零基础使用教程

安装既然学习 react router 就免不了运行 react安装 reactnpx create-react-app my-appcd my-appnpm start安装 react routernpm install react-router-dom如果一切正常,就让我们打开 index.js 文件。配置路由引入 react-router-dom 的 RouterProviderimport {Route…

JavaWeb--Filter

Filter1 Filter概述2 Filter快速入门2.1 开发步骤2.2 代码演示3 Filter执行流程4 Filter拦截路径配置5 过滤器链5.1 概述5.2 代码演示5.3 问题6 案例6.1 需求6.2 分析6.3 代码实现6.3.1 创建Filter6.3.2 编写逻辑代码6.3.3 测试并抛出问题6.3.4 问题分析及解决6.3.5 过滤器完整…

智慧供热|供热末端(住户)管网远程监测方案

智慧供热通过对供热相关数据的采集、分析和对热源、热网、末端(住户)的各个供热环节进行智能调控,从而进一步实现热网资源的配置优化,提高热网输送的能力。供热行业存在问题:供热企业目前面临的主要问题还是资金周转困…

MYSQL1

MySQL基本11、MySQL 中有哪几种锁?2、MySQL 中有哪些不同的表格?2、什么是存储引擎3、MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别4、CHAR 和 VARCHAR 的区别1、固定长度 & 可变长度2、存储方式3、存储容量4、CHAR会…

cookie session Token终极理解

左边 浏览器 右边 服务器 浏览器发送请求 服务器接收请求 并生成cookie 浏览器查看保存了哪些cookie 用户名密码放在cookie是很不安全的 因为浏览器一旦被攻击泄露 是很危险的 接着诞生了session 会话 sessionID (一段杂乱的字母标识) 会话结束时间 …

【云原生】Istio请求路由、流量转发、超时配置等

代码继续接着前面的文章【云原生】整合K8s SpringCloudK8s gRpc RocketMQ Istio Envoy,本篇文章我们测试下请求路由功能。生产中我们上了个新接口或者新功能,一般会经过 内灰 -> 外灰5% -> 外灰10% ...... 外灰100%的过程,这篇文章…

计算机图形学08:中点BH算法绘制抛物线(100x = y^2)

作者:非妃是公主 专栏:《计算机图形学》 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、算法原理二、…

springboot整合mybatis框架,简单实现CRUD

如果大家实在不知道怎么搞可以去看看官网:mybatis-plus官网MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。其实也就是在…

5. 驱动开发

文章目录一、驱动开发1.1 前言1.2 何谓驱动框架1.3 内核驱动框架中LED的基本情况1.3.1 相关文件1.3.2 九鼎移植的内核中led驱动1.3.3 案例分析驱动框架的使用1.3.4 典型的驱动开发行业现状1.4 初步分析led驱动框架源码1.4.1 涉及到的文件1.4.2 subsys_initcall1.4.3 led_class_…

windows应用(vc++2022)MFC基础到实战(1)

目录vc概述MFC 框架概述MFC 框架SDI 和 MDI文档、视图和框架窗口对象文档/视图体系结构第一个应用自动生成的主框架类源码vc概述 Microsoft Visual C(简称Visual C、MSVC、VS或VC)是微软公司的免费C开发工具,具有集成开发环境,可…

Spring Security OAuth2实现多用户类型认证、刷新Token

原本的OAuth2登录支持用户名密码登录,现在还想支持另外用id号码和密码登录。但是OAuth2默认提供的UserDetailsService只允许传入一个参数:想要实现多种用户登录,是不是可以考虑loadUserByUsername方法携带多个参数呢?接下来记录一…

Docker安装和Docker安装Nginx及其他常用操作

一、Docker简介 Docker 是一个开源的应用容器引擎,基于Go 语言并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全…

机器学习与目标检测作业:连通块算法

机器学习与目标检测作业:连通块算法一、连通块算法题目描述二、连通块算法文件结构三、连通块算法程序编写3.1、连通块算法conBlock.h头文件内容3.2、conBlock.cpp源文件内容3.3.3、mian.h头文件内容3.3.4、main.cpp源文件内容如下四、连通块算法程序运行结果一、连…

【JS知识点】——原型和原型链

文章目录原型和原型链构造函数原型显式原型(prototype)隐式原型(\_\_proto\_\_)原型链总结原型和原型链 在js中,原型和原型链是一个非常重要的知识点,只有理解原型和原型链,才能深刻理解JS。在…

云上办公系统项目

云上办公系统项目1、云上办公系统1.1、介绍1.2、核心技术1.3、开发环境说明1.4、产品展示后台前台1.5、 个人总结2、后端环境搭建2.1、建库建表2.2、创建Maven项目pom文件guigu-oa-parentcommoncommon-utilservice-utilmodelservice-oa配置数据源、服务器端口号application.yml…

D2-Net: A Trainable CNN for Joint Description and Detection of Local Features精读

开源代码:D2-Net 1 摘要 在这项工作中,我们解决了在困难的成像条件下寻找可靠的像素级对应的问题。我们提出了一种由单一卷积神经网络发挥双重作用的方法:它同时是一个密集的特征描述符和一个特征检测器。通过将检测推迟到后期阶段&#xf…

统计代码量

一 windows 在 Windows 系统上,您可以使用 PowerShell 命令行工具来统计项目的代码量。下面是使用 PowerShell 统计项目代码量的步骤: 打开 PowerShell 终端:按下 Win X 键,选择「Windows PowerShell(管理员&#xf…

SQL分库分表

什么是分库分表? 分库分表是两种操作,一种是分库,一种是分表。 分库分表又分为垂直拆分和水平拆分两种。 (1)分库:将原来存放在单个数据库中的数据,拆分到多个数据库中存放。 (2&…

【三.项目引入axios、申明全局变量、设置跨域】

根据前文《二.项目使用vue-router,引入ant-design-vue的UI框架,引入less》搭建好脚手架后使用 需求: 1.项目引入axios 2.申明全局变量 3.设置跨域 简介:axios本质上还是对原生XMLHttpRequest的封装,可用于浏览器和nodejs的HTTP客…