【学习笔记】码农的自我修养之必备技能


码农的自我修养之必备技能 学习笔记

?欲善其事 必先利其器

作为一个码农,下面这些基本功虽然不是肯定要具有,但大部分在未来还是能在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退出并保存。

移动光标

除了上下左右箭头,在命令模式下字母区的hjkl分别对应左、下、上、右移动光标。

删除

命令模式下

  • x,X分别对应向后[del]和向前[backspace]删除一个字符
  • nx,连续向后删除n个字符
  • dd,删除一整行

复制粘贴

命令模式下

  • yy复制一行
  • p,P分别光标下一行和上一行在粘贴复制的内容
  • nyy,复制n行

复原和重做

命令模式下

  • u:undo
  • ctrl+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 git@github.com: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 <35261585+JettHu@users.noreply.github.com>
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 addgit 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 <35261585+JettHu@users.noreply.github.com>
Date:   Sun Mar 29 13:07:37 2020 +0800

    Update README.md

commit 75daf6fe0572d2b7292863dbc85de3d09ddcbce6
Author: JettHu <35261585+JettHu@users.noreply.github.com>
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高级软件工程