【CSDN编者按】自1987年以来,比尔·盖茨首次出现在福布斯全球富豪榜上,就开始了他的辉煌时代。科技上,他建立起了微软这个庞大的科技帝国;慈善上,他捐赠了数十亿美元用于全球健康项目——毋庸置疑,比尔·盖茨绝对是全球最受尊重的偶像之一。
而这位出生于1955年的首富,少年时就对编程有着极为浓厚的兴趣,也正是这种“自学成才”的精神,助他一步步走上人生的巅峰。
作者 | Genevieve Carlton
译者 | 彼得
责编 | 郭芮
出品 | CSDN(ID:CSDNnews)
以下为译文:
比尔·盖茨是当今世界上最富有的人之一。作为微软的联合创始人,盖茨建立起了一个庞大的科技帝国。作为比尔和梅琳达·盖茨基金会的联合创始人,他捐赠了数十亿美元。但是,比尔·盖茨在创立微软之前是个怎样的人呢?
比尔·盖茨在年轻的时候是一个勇于挑战和打破现有规则的人。这一点,也许是他能成为历史上最成功的自学成才的程序员的原因之一。
在他11岁的时候,比尔·盖茨变得爱和人争论并且沉默寡言。他的父母,威廉和玛丽·盖茨,认为他们的儿子在学校可能让人讨厌,没有朋友,因而十分担心。比尔·盖茨在家也拒绝做家务,并且和母亲争吵。盖茨曾经对他的一位顾问说过:“在那个时候,我和我的父母就谁应该拥有控制权而斗争。”
对控制权的争取和对现有规则的蔑视,对比尔·盖茨的发展提供了积极的引导作用,把他从一个郁郁寡欢的孩子变成了一个自学成才的青年程序员。所有的这一切,都是从盖茨的父母让他在西雅图的莱克赛德学校(Lakeside)上学的时候开始的。
这所预备学校是全国最早拥有计算机的学校之一。正如比尔·盖茨后来解释的那样,“我13岁的时候就喜欢上了编程。那个时候,我所在的学校刚刚成为全国第一批拥有计算机终端的学校之一。这台机器又大又慢,甚至连屏幕都没有,但是,我还是被它吸引住了。”
在1968年,盖茨和他的朋友们每天都在电脑上花上几个小时,来学习电脑的编程语言:BASIC或初学者通用的符号指令代码。很快,盖茨就可以自己编程。
盖茨第一次的编程实践是和一个流行的游戏相关。盖茨说:“我13岁的时候,写了我的第一个软件程序。这是为了玩井字游戏进行的开发。当时,我用的电脑虽然又大又笨重,而且速度又很慢,但是它绝对引人注目。”
当比尔•盖茨在20世纪60年代开始自学编程时,那个时代的计算机和我们今天看到的大不相同。盖茨回忆说,“当时的计算机终端没有屏幕。为了玩,我们在打字机式的键盘上输入我们的动作。”在井字游戏中,进入每一步之后,玩家都必须等待计算机打印出他们的动作。
盖茨开发这个程序的时候,没有太在意效率。“使用铅笔和纸张玩一个井字游戏需要30秒的时间,这可能会占用大部分午餐时间,但是没有人在乎。当时,在机器上,我们也只有这些东西可玩。”
在莱克赛德学校,比尔·盖茨在计算机房遇到了比他大两岁的学生保罗•艾伦。他们很快学会了以系统操作员的身份登录到计算机系统,从而避免了使用机器的时间限制。当他们暂时无法访问莱克赛德学校的计算机的时候,他们就假冒大学生,去华盛顿大学。
当比尔·盖茨假冒大学生来使用那些功能强大的计算机的时候,他才十几岁。与艾伦一起,盖茨使用了CDC6400和Burroughs5500,这两种机器需要使用包含运行程序代码的穿孔卡片。
盖茨在读高中的时候,就利用他的编程能力进行商业运作。他使用另一种编程语言Fortran创建名为Traf-O-Data的一家公司。保罗·艾伦解释说:“如果不是因为我们在traf-0-data所作的尝试,微软可能就不会出现。”
Traf-O-Data公司主要开发统计西雅图交通量的计算机系统。当他们通过Traf-O-Data公司赚到2万美元的时候,艾伦和盖茨还都只是十几岁的孩子。虽然他们的公司最终破产了,但它也给盖茨宝贵的经验教训,比如将编程和商机进行结合所能创造的价值。
在莱克赛德学校学习的这些年,盖茨曾经多次潜入华盛顿大学校园,偷偷访问他们不同地点的计算机系统。他和艾伦听说物理大楼的PDP-10每天凌晨都可以使用几个小时,盖茨后来说,“一位朋友有物理大楼的钥匙,所以我们偷偷地去了很多次。”
后来,他去了哈佛大学并且在学习不到两年后就退学。这时,盖茨已经拥有丰富的编程经验。他创立了一家公司,他为政府机构编写代码,并且他自学了很多编程语言。正如盖茨后来所说,“自我探索是伟大的,因为你培养了一种自信心。”
编程给了盖茨方向。“如果你的程序错了,尝试之后你就知道。如果程序不能工作,你就会解决问题,然后再一次进行尝试。”
在很小的时候,盖茨就开始尝试控制计算机。盖茨以成人的身份解释说,他对计算机很着迷,因为计算机给了他一种孩提时代的控制感。“我们太小了,不能开车,也不能做大人可以玩的其他事情,但是我们可以给这台大机器下订单,它会一直服从的。”
比尔·盖茨知道什么时候该改变规则,什么时候该遵守规则。他从小就重视自我探索。后来,这种推动的意愿帮助微软取得了成功。
我们能从比尔·盖茨的青年时代学到什么?
学习什么时候可以改变规则。比尔·盖茨可能偷偷溜进了大学的计算机实验室,但他这样做是有原因的。盖茨无法正常使用华盛顿大学的高级计算机,但盖茨想办法得到了他想要的。正如他解释的那样,“那里的人们给了我们很多帮助。他们借给我们手册和让我们能从垃圾箱中找到操作系统清单。”
保持前进的动力并不断进行探索。当比尔•盖茨的第一家公司Traf-o-data倒闭时,他并没有放弃。当他在1977年因交通违规被捕时,他也没有放弃。他一直致力于实现让数百万人使用计算机的目标 - 他成功了。 比尔•盖茨在创建微软之前是谁?他是一个自学成才的程序员,他利用自己的技能实现自己的目标。
你如何优先考虑自我探索?请在下面的评论中告诉我们!
原文:https://selftaught.blog/bill-gates-microsoft/
本文为 CSDN 翻译,如需转载,请注明来源出处。
热 文 推 荐
print_r('点个好看吧!');
var_dump('点个好看吧!');
NSLog(@"点个好看吧!");
System.out.println("点个好看吧!");
console.log("点个好看吧!");
print("点个好看吧!");
printf("点个好看吧!\n");
cout << "点个好看吧!" << endl;
Console.WriteLine("点个好看吧!");
fmt.Println("点个好看吧!");
Response.Write("点个好看吧!");
alert("点个好看吧!")
echo "点个好看吧!"
点击阅读原文,输入关键词,即可搜索您想要的 CSDN 文章。



在工作中,我们必不可少需要掌握的就是git的一些操作了,那么git究竟是什么东西呢?
git,打个比喻来说,相当于游戏的存档功能。我们把每一次的代码修改保存下来,方便我们进行代码的回溯和发布。而github和gitlab这样的软件,就相当于一种云存档,我们会将我们已经开发完成的功能分支推送到github上,当代码通过审查后,合并到主分支(一般是main/develop分支),最后去上线主分支的代码。这样不仅可以让我们无论处于何地都能拉取到代码,而且最重要的是它在团队协作中起到的作用。
1. git 配置
当我们去官网将安装下来后,首先可以使用git -v
命令查看是否安装成功。
当能够显示出版本号时就说明安装成功了,接下来我们应该做的就是git的一些配置。
git提供了一个git config的命令,用来配置或读取相应的工作环境变量。我们需要配置个人的用户名称和电子邮件地址(一般设置为自己github或者gitlab的用户名与邮箱地址),这是为了在每次提交代码时记录提交者的信息:
js 代码解读复制代码git config --global user.name "xxxxxx"
git config --global user.email xxxx@xxxx.com
一般来说的话,配好这两个就够用了,我们可以使用git config --list
命令来查看现在的git配置。
2. git 工作流程
那么一般在真实的工作环境中是怎么使用git的呢?
我简单总结了一下,大概是以下流程:
假如主分支是develop,然后使用git checkout -b feature/user-login创建了一个分支,然后我们进行开发,完成一个小部分后,git add 和git commit,一般频繁commit比较好,然后下班前使用git push -u origin feature/user-login提交到远程的feature/user-login分支。几天后,这个feature/user-login功能分支开发完毕后,通过MR或PR进行代码审查,审查通过后一般是由主管来将这条功能分支合并到主分支。然后合并完成后我们再把这条功能分支远程和本地删除
其中有几个比较重要的小点:
-
我们不会直接在主分支上进行开发,而是在主分支上创建一个自己的功能分支,在这条功能分支上进行开发,最后代码通过审查后,再合并到主分支上。这是为了保证主分支的整洁与减少冲突,当所有人都在主分支上进行开发时,代码将会变得非常混乱。
-
原子化提交,每次提交只解决一个问题(如:
git commit -m "fix(login): 修复验证码发送频率限制"
) -
单个功能分支存活时间不超过 1周,为了避免将来将功能分支合并到主分支时产生过多冲突,并且合并完成后尽快删除本条功能分支,避免成为“僵尸分支”,让其他成员误以为该分支还在使用。
-
养成每日下班前推送代码的好习惯,为了防止本地代码丢失;方便他人查看我们的进度等等。
这是大概的一个流程,接下来,我们用一个小demo来模拟一下开发流程。
2.1 克隆仓库
如果是自己单独进行一个项目的开发,会使用git init
初始化一个本地的git仓库,用来开始一个新项目。但一般来说我们都是团队协作开发一个项目,当我们入职后,使用git clone
将远程的代码拉取下来。
有两种代码拉取方式,一种是https方式,每次拉取时都要输入github的账号与密码,比较麻烦。所以我们会使用SSH进行代码的拉取,首先会进行SSH密钥的配置,这个网上都有教程,直接去搜一下即可,配置非常简单。
这样我们就可以直接使用SSH进行代码的拉取啦,不需要再输入账号和密码。
这样我们就成功将这个仓库拉下来了。目前只有readme.md这一个文件,接下来我们来模拟一下在工作中是如何使用git的。
2.2 创建新分支
我们说过,我们不会直接在主分支上进行开发,而是会创建一个新分支进行开发。我们可以在gitlab查看我们的主分支是哪一条:
主分支是master。我们也可以使用git branch
命令查看所有分支:
目前只有master这一条主分支,master前面的星号就代表我们目前处于哪一条分支。那么我们如何来创建一条新分支呢?可以使用git checkout -b
命令。这个命令可以用来创建一个新分支并且切换到这条分支上。
在创建新分支之前一定要保证我们处于主分支上,一般是develop或者main分支上。切换分支直接使用git checkout xxx分支
命令。
它输出显示我们已经位于主分支上,然后我们可以基于主分支创建一条功能分支,分支名要明确,比如我们要开发一个用户登录功能,我们一般会写git checkout -b feature/user-login
。
好的,我们已经创建了一条功能分支并且已经位于这条分支上了,我们可以再次使用git branch
查看所有的分支:
现在已经有两条分支了,并且我们目前位于功能分支上。我们还可以使用git branch -r
查看远程分支:
因为我们还没有进行推送,所以远程分支上没有我们创建的功能分支。我们还可以使用git branch -a
查看所有本地和远程分支:
2.3 在功能分支上进行代码的开发
ok,我们已经创建了一条属于我们自己的功能分支,接下来我们就开始在这条功能分支上进行开发,比如我添加一点内容:
之前的readme中只有git操作这一内容,现在我们添加了一行用户登录功能内容,我们可以发现vscode直接给我们显示出来发生的变化,左边有一串绿色的标记,并且在最左侧的功能栏中的源代码管理产生了一个气泡,说明此时我们有一个更改,并且我们可以直接点那个蓝色的提交按钮进行代码的提交,我们也可以使用命令来提交。
我们可以使用git status
来查看目前的状态:
我们发现它显示有一个更改,这表示我们没有将代码提交到暂存区。ok,又来了一个新概念,什么叫暂存区呢?
git中存在工作区、暂存区和版本库的概念:
-
工作区:工作区是你在本地计算机上的项目目录,你在这里进行文件的创建、修改和删除操作。工作区包含了当前项目的所有文件和子目录。
-
暂存区:暂存区是一个临时存储区域,它包含了即将被提交到版本库中的文件快照,在提交之前,你可以选择性地将工作区中的修改添加到暂存区。使用
git add
将代码提交到暂存区。 -
版本库:版本库包含项目的所有版本历史记录。每次提交都会在版本库中创建一个新的快照,这些快照是不可变的,确保了项目的完整历史记录。使用
git commit
将在暂存区中的代码提交到版本库中。
最后,当今天的工作结束后,我们使用git push origin
将最新的版本库代码推送到远程仓库。
2.4 暂存文件与提交更改
因为我们说过尽量原子化进行开发,当完成了一小部分的开发就去提交一下代码。使用git add .
命令可以将所有的更改提交到暂存区,我们还可以指定文件提交到暂存区:
当我们将代码提交到暂存区时,再使用git status查看状态时就会发现已经变绿了,说明我们已经将代码提交到了暂存区。如何再使用git commit将代码提交到版本库中,提交的时候描述信息要说明清楚,说明这是一个什么类型的提交:
一般用feat表示增加新功能,fix表示修复bug。此时我们已经把代码提交到版本库中了,我们再使用git status查看状态:
它就会显示没有东西需要提交到了。
此时如果我们切换到主分支:
我们就会发现主分支与功能分支的差异,我们的功能分支领先于主分支,最后当我们的功能分支开发完毕后,再合并到主分支上。
我们再切换回功能分支,我们还可以使用git log
查看历史提交记录:
我们发现总共有两次提交,通过查看所有的提交记录,我们可以进行版本的恢复与回退:
-
git reset:重置当前分支到特定提交
-
git revert:撤销某次提交
2.5 推送更改
最后,当今天的任务完成后,我们将今天的代码推送到远程仓库进行保存,但在推送本地更改之前,最好从远程仓库拉取最新的更改,以避免冲突:
场景 1:需要合并主分支最新代码
适用情况:其他开发者在 develop
分支提交了新代码,你需要将这些更新合并到自己的功能分支
正确操作:
js代码解读复制代码# 在功能分支操作 git checkout feature/login git fetch origin # 获取远程最新状态 git merge origin/develop # 将 develop 的更新合并到当前分支
场景 2:同步自己的远程功能分支
适用情况:你在其他设备(如公司电脑和家用电脑)上开发同一功能分支
正确操作:
js代码解读复制代码git checkout feature/login git pull origin feature/login # 等同于 fetch + merge
为什么推荐先 fetch 再 merge?
- 安全性:
git fetch
允许你先查看差异(git log origin/develop
),再决定是否合并- 可控性:避免
git pull
自动合并可能引入意外代码
当获取完最新的更改后,我们就将代码推送到远程仓库:
此时我们就会发现我们的远程仓库多了一条分支:
2.6 合并更改
最后,当我们的功能分支开发完毕后,就会去创建一个合并请求(MR/PR),源分支选择:feacture/user-login,目标分支选择:master。当代码审查通过后,我们就需要将功能分支合并到主分支上了。
2.7 删除分支
合并成功之后,我们就需要将这条功能分支删除,使用git branch -d new-feature
删除功能分支:
3. 总结
在工作中常用的一些git操作命令就是这些了,如果对你有帮助的话请点个赞吧!
评论记录:
回复评论: