码农的自我修养之必备技能 学习笔记
⼯欲善其事 必先利其器
作为一个码农,下面这些基本功虽然不是肯定要具有,但大部分在未来还是能在Coding的路上给予很大的帮助。
扎马步
码字是一个码农的基本功。
盲打,个人认为是一个程序员必备的基本技能之一,否者一行代码的时间你要花两行代码的时间来输入,甚至用的是"一指禅",那就看起来没那么专业了。
打字速度这东西,无他,唯手熟而。只有平时多敲,下意识的使用盲打,让自己的技能提升上去。
有个打字平台可以进行测试与练习:TypingClub
在最终的关卡#684里,你可以测试自己的准确率和速度。
通过的标准是100%的准确和50WPM以上的速度。
一个趁手的兵器
虽然说记事本也可以打开就进行码字,vi也不差,但是一个趁手的编辑器(IDE)往往能给编码效率带来很大的提升。
如果想要某门语言专门的IDE,那还是推荐Jetbrain家的产品,即拆即用,不用杂七杂八的配置。但IDE往往过于庞大,打开加载就可能需要花费一段时间,且往往专攻与某个语言。
或者说有了一个重型的IDE,你还需要一把小刀(编辑器)
Visual Studio Code是微软开发的轻量强大的跨平台代码编辑器。你可能会说那Sublime、Notepad++不行吗,但因为拥有丰富的插件生态环境,有着良好的插件开发语言和规范,生态往往能决定一款产品的寿命。
VSCode团队甚至开发了TypeScript,设计了LSP、DAP来让VSCode在轻量的同时保持高效。
- 代码编辑(轻量)
- 跨平台运行、开源
- 插件丰富、插件开发社区规范
参见VSCode指令可以通过Help>Keyboard Shortcuts ref
来打开
简单使用的快捷键和一般的IDE编辑器无区别,可以让用户快速上手:
ctrl+O
打开文件夹和ctrl+K F
关闭文件夹工作区ctrl+N
新建文件、ctrl+W
关闭文件、ctrl+S
保存文件ctrl+F
搜索、ctrl+H
替换ctrl+1、2、3
切换文件编辑器
你可以在插件选项卡搜索安装各种需要的插件。
VSCode有着:
- 简洁而聚焦的产品定位,专注开发者"最常用"的功能
- 进程隔离的插件模型
- UI渲染与业务逻辑隔离
- 巧妙的LSP和DAP两大协议设计和使用
- 前瞻性的架构决策和扎实的工程基础
这些设计在日后的应用开发中或许能带来很好的启示和方向。
一个优秀的管家
写代码,其实不光写代码,很多时候我们不停的发布,修改某样东西,这样就在电脑中存在各种版本。需要一个优秀的管家来帮助版本控制。
Git是目前世界上最先进的分布式版本控制系统,也是程序员的必备技能。
- Git本地的Repo(仓库),可能存在多个branch(分支),用户可以切换/新建不同的分支作为工作区。
- 工作区更新修改的内容先添加到Index中,再提交到Repo上,这样一次修改就作为记录成功写入Git。
- Git可以对进行回档,所以就不必在本地进行一次次的备份不同版本的代码。
- Git还可以多人协作同一个文档,遇到冲突进行解决合并即可。
基本用法
λ git init # 初始化一个本地版本库
Initialized empty Git repository in F:/homeworkspace/高级软件工程/test/.git/
λ git status # 查看工作区状态
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
接着在文件夹内新建个文档vi README.md
,写入hello, git!
λ git status # 再次查看状态
On branch master
No commits yet
Untracked files:
(use "git add ..." to include in what will be committed)
README.md
nothing added to commit but untracked files present (use "git add" to track)
再次查看文件状态,可以发现有一个Untracked files
,下面的括号内也提示,可以使用git add
来将追踪文件,也就是加入index中。
λ git add * # 使用新添加所有untracked files
The file will have its original line endings in your working directory
λ git status # 状态得到更新
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached ..." to unstage)
new file: README.md
状态得到更新,下面提示修改是新建了一个文件README.md
,你可以通过git rm --cached
来撤回刚才的track操作。
λ git commit -m "wrote hello world in readme.md" # 将修改提交
[master (root-commit) 05db1d4] wrote hello world in readme.md
1 file changed, 1 insertion(+)
create mode 100644 README.md
修改下README.md
,在下面添加一行新的内容,并且commit到仓库。接着使用git reset
来回退版本。
λ git log # 通过git log来查看提交的日志
commit 02268b54d5ddb926591dfb7a34aa000515a400dc (HEAD -> master)
Author: XXXX
Date: Sun Mar 29 12:01:42 2020 +0800
add new line
commit 05db1d453313522228919b37da9ca91ba4001626
Author: XXXX
Date: Sun Mar 29 11:54:52 2020 +0800
wrote hello world in readme.md
λ git reset --hard HEAD^^ # 回退到前一版本
HEAD is now at 05db1d4 wrote hello world in readme.md
回退后可发现,README.md
中的新增的一行不见了。如果这时候要后悔了,可以同样通过git rest
来回到想要的版本。
λ git reflog # 查看当前HEAD之后的commit日志
05db1d4 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
02268b5 HEAD@{1}: commit: add new line
05db1d4 (HEAD -> master) HEAD@{2}: commit (initial): wrote hello world in readme.md
λ git reset --hard 02268b5 # --hard commit-id/commit-id的头几个字符
HEAD is now at 02268b5 add new line
远程Git仓库
Github是最大的Git远程仓库。
Git的一些远程操作
git remote add [remote repo]] # 添加远程仓库
git remote -v # 查看当前所有远程仓库信息
git push [name] [branch] # 将本地内容推到远程仓库
git clone [remote repo] # 将远程某个仓库的分支的内容克隆到本地
git fetch [remote repo] [remote branch] # 将远程内容下载到本地
git merge [remote repo/brach] # 将不同分支内容合并
git pull [remote repo] [branch] # 相当于git fetch + git merge
再具体就变成Git教程了,其他操作可以见网上教程
编辑器之神?
VIM被网友称为编辑器之神
- 所有的Unix-like系统一般都预装vi文本编辑器。
- vim是程序开发者由vi发展出来的一个文本编辑器,具有代码补全、编译错误及错误跳转等方便编程的功能
三种形态
- 命令模式:可以对光标进行操作的状态,刚启动时便是命令模式。此状态键盘动作会被识别为命令,而不是输入字符。
- 输入模式:在命令模式下按下
i
则进入输入模式,按下ESC
退出输入模式,切换回命令模式。 - 底线命令模式:在命令模式下按下
:
则进入底线命令模式。可以输入更多的字符作为命令。比如基本的q
退出不保存,w
保存文件,wq
退出并保存。
移动光标:
除了上下左右箭头,在命令模式下字母区的h
,j
,k
,l
分别对应左、下、上、右移动光标。
删除:
命令模式下
x
,X
分别对应向后[del]和向前[backspace]删除一个字符nx
,连续向后删除n个字符dd
,删除一整行
复制粘贴
命令模式下
yy
复制一行p
,P
分别光标下一行和上一行在粘贴复制的内容nyy
,复制n行
复原和重做
命令模式下
u
:undoctrl+r
:redo
搜索
底线命令模式下
/word
向光标下寻找匹配的字符串?word
向光标上寻找匹配的字符串n
,next表示继续向下(向上)寻找下一个匹配的字符串N
,反向寻找下一个匹配字符串
搜索替换
底线命令行下
n1,n2s/word1/word2/g
,在n1和n2行之间寻找word1替换为word2- s表示substitute,替换单词
- 后面的参数g表示全局(global)替换,还可以加入c表示需要确认(comfirm),i表示不区分大小写(ignorecase)
其他
:set nu
:显示行号:set nonu
:取消行号
注释:
- 注释:
:n1,n2s/^/注释符/g
- 取消注释:
:n1,n2s/^注释符//g
自动化宏命令:
在命令模式下按下q
,接着按下[a-z]
任意字符,开始录制命令,再次按q
结束录制。
使用时,输入n@[a-z]
来重复使用n次宏命令
正则表达式
正则表达式是对字符串操作的一种逻辑公式,常用于匹配字符串,替换文本,提取字串,测试字符串等。
语法网上有很详细的教程
练习作业
Git
在Github上新建一个repo(勾选创建README.md),然后clone到本地
λ git clone [email protected]:JettHu/se2020ex.git # clone
Cloning into 'se2020ex'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
λ cd se2020ex\ # 进入文件夹
新建一个dev
分支
λ(master) git checkout -b dev # 新建分支,并自动切换
Switched to a new branch 'dev'
λ(dev)
修改README.md
文件,修改两次,提交信息分别为A,B。内容如下:
# se2020ex
this is local dev branch add line 1
this is another line form local dev branch
提交后的日志如下:
λ (dev) git log
commit 14dce70b371c61940f7dcad816cdcf6cedaa068f (HEAD -> dev)
Author: Jett
Date: Sun Mar 29 13:04:04 2020 +0800
B
commit 2d166ca22f263e7d6af0baf67bc38f079c99e3b8
Author: Jett
Date: Sun Mar 29 13:03:40 2020 +0800
A
commit 75daf6fe0572d2b7292863dbc85de3d09ddcbce6 (origin/master, origin/HEAD, master)
Author: JettHu <[email protected]>
Date: Sun Mar 29 12:59:53 2020 +0800
Initial commit
(END)
在Github网页上对远程仓库操作,同样修改README.md
本地切换回master分支,进行git pull
更新
λ(dev) git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
λ(mater) git pull
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From github.com:JettHu/se2020ex
75daf6f..96c4537 master -> origin/master
Updating 75daf6f..96c4537
Fast-forward
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
切换回dev分支,进行git rebase
λ(dev) git rebase -i master
修改除了一个外所有的pick
结果提示我们有冲突,需要我们手动解决所有冲突后,再用git add
和git rebase --continue
继续
λ(dev) git rebase -i master
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
error: could not apply 2d166ca... A
Resolve all conflicts manually, mark them as resolved with
"git add/rm ", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply 2d166ca... A
将冲突中多余部分删除,保留remote和local的两条语句后重新git add .
和git rebase --continue
。
将两条commit message合并。
λ(dev) git rebase --continue
[detached HEAD 973aebb] A
1 file changed, 1 insertion(+)
[detached HEAD dc7b44e] A B together
Date: Sun Mar 29 13:03:40 2020 +0800
1 file changed, 2 insertions(+)
Successfully rebased and updated refs/heads/dev.
回到master,使用git merge dev
进行合并
λ(dev) git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
λ(master) git merge dev
Updating 96c4537..dc7b44e
Fast-forward
README.md | 2 ++
1 file changed, 2 insertions(+)
检查下文件和日志
λ(master) git log
commit dc7b44e6d067f44e0994efda407cd99fa3a242d2 (HEAD -> master, dev)
Author: Jett
Date: Sun Mar 29 13:03:40 2020 +0800
A B together
commit 96c45374da5dca4458007c3ff3b86dc5e102e274 (origin/master, origin/HEAD)
Author: JettHu <[email protected]>
Date: Sun Mar 29 13:07:37 2020 +0800
Update README.md
commit 75daf6fe0572d2b7292863dbc85de3d09ddcbce6
Author: JettHu <[email protected]>
Date: Sun Mar 29 12:59:53 2020 +0800
Initial commit
OK,一切正常,push回远程仓库
λ(master) git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 322 bytes | 64.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:JettHu/se2020ex.git
96c4537..dc7b44e master -> master
VIM
- 将当前文件中xxx字符串全部替换为yyy字符串
:1,$s/xxx/yyy/g
- 将当前文件中xxx字符串全部替换为yyy字符串
:10,20s/^/#/g //#号注释
:10,20s#^#//#g //双斜杠注释
- 将2-3行代码复制粘贴10次
光标移动到第二行
命令模式下按下q [a-z]录制宏命令输入
2yyP
再按下q退出录制
移动到在想要粘贴的位置,输入10@[宏命令的字符]
作者:SA19225176,万有引力丶
参考资料来源:USTC SE2020高级软件工程