xyecho - just my notes 2024-08-14T05:49:37+00:00 1447675994@qq.com 2024年8月 2024-08-01T16:12:15+00:00 kane http://blog.xyecho.com/develop-log 准备开始开发笔记~

2024年8月7日

今年把自己的笔记越整理越少,感觉现在的笔记比较以前有用多了。 这两年来一直在做减法,一点也不简单,自己的生活,工作都太臃肿了。

最近一直在整理 golang 的代码。把自己工作中,业务中比较有共性的服务抽出来。方便以后使用。 看来要整理的东西不少。

2024年8月8日

业务上做了一个排队的逻辑,是不是后面考虑做成一个排队系统。

排队的业务逻辑是:(以游戏区服为例)

1、用户要进入一个区服玩游戏,要先申请该区服是否有坑位。

2、如没有则进入该区服的队列中,如果有,则直接进入。

3、另有协程,用定时器,每隔一段时间就去申请是否有坑位,如果真进入,把用户从坑位中退出来。 4、用户可以取消排队。 5、考虑用户的VIP属性,即可以插队。(业务上并没有要求这一点,自己在设计时想到的)

想到的就是用 redis 的 zset 来现实。

用 区服ID 做 key, 用户ID 做 menber, 申请时间做 score。

考虑加入到 VIP 特性。可以在申请时间前面加一个权重, 所以 score 是 weigth + apply_time。

zset 按时间大小排序,越早申请时间越小,越排在前面。 zset 成员对应的位置越靠前。 注意 zset 是从 0开始,所以结果要加了1。

操作如下:

加入队列用 Zadd key menber score

拿出队列中的第一个:ZrangeWithScores key 0, 0

出队列: Zrem key menber

查询在队列中的位置: Zrank key menber

查询出队列的长度: Zcard key

其实,以前也有用 redis 的 zset 做过游戏的排行榜, 方法大同小异吧。

2024年8月9日

整理了一下公司的文档,工作中要记文档,但也别写太多的文档,把主要工作给淹没了。多写文档还有好处的,能正确清晰的表达出来。说明已经很好的理解了。

自己的写的一个服务,紧紧张张的完成,设计方案还可以,但是去发现有三个英文单词写错了。糟糕的是有两个是对外提供的接口上了。写了那么多的代码没有发现写错了,是不是很奇怪? 因为我们定义好之后,很多时候vscode 的插件会自动提醒我怎么写,不断的按 tab 或 enter 就以了。 特别是现在用了 ai的插件之后,现加方便了很多。 但这不是主要原因,主要原因还是自己粗心和自己的英文弱项。

2024年8月10日

今天加班!

整理了一个 golang 的公共库,但我又不方便在 github 公开。所以放在本地。那又如何方便的引用本地的呢?

写了一个 ws 的简单服务,如果对 websocket 还没真正用过。要了解一下 websocket 协议的内容才行。

在了解 websocket 时,找到了一个学习的 blog c++后端开发的,记录一下:

https://github.com/0voice/cpp_backend_awsome_blog/tree/main

【NO.23】一篇文章彻底搞懂websocket协议的原理与应用(一)

2024年8月14日

工作上的时间安排并不是很合理,一周内要完成的都高优先级的。即:一、二、三、四等等的事项并排最高优化。我自然是觉得这样不科学,但是相关人给的回复让我有点无语了。

当然,我应当反思自己的沟通方式。 年纪越来越大,自己的说话的方式和沟通技巧好像没有很大的进步。

]]>
golang time adddate 2024-04-11T09:08:12+00:00 kane http://blog.xyecho.com/golang-time-adddate 周末线上出现一个问题,3月份的订单没有算出来,从数据库表数据上看,订单数据已经是完成状态,但数据为空。

业务上的逻辑是,每天会计算上个月的订单和当月的订单和。一月的订单周期是一个有1日12点到下个月的1日12点。

如前当3月31日,上个月的周期是2月1日12点到3月1日12点;本月的周期是3月1点12到当前时间点。

逻辑在处理上个月的订单时用了 AddDate

lastMonth := time.AddDate(0, -1, 0).Format("200601")

问题就出现在这里。 当前时间是3月31时,time.AddDate(0, -1, 0) 之后,是 20240302 ,还是3月份,并不符合预期。

如下代码:

package main

import (
	"fmt"
	"time"
)

func main() {

	today := time.Date(2024, 2, 29, 0, 0, 0, 0, time.Local)
	nextDay := today.AddDate(0, -1, 0)
	fmt.Printf("today :%v nextDay :%+v \n", today.Format("20060102"), nextDay.Format("20060102"))

	today = time.Date(2024, 3, 31, 0, 0, 0, 0, time.Local)
	nextDay = today.AddDate(0, -1, 0)
	fmt.Printf("today :%v nextDay :%+v \n", today.Format("20060102"), nextDay.Format("20060102"))

	today = time.Date(2024, 4, 30, 0, 0, 0, 0, time.Local)
	nextDay = today.AddDate(0, -1, 0)
	fmt.Printf("today :%v nextDay :%+v \n", today.Format("20060102"), nextDay.Format("20060102"))

	today = time.Date(2024, 5, 31, 0, 0, 0, 0, time.Local)
	nextDay = today.AddDate(0, -1, 0)
	fmt.Printf("today :%v nextDay :%+v \n", today.Format("20060102"), nextDay.Format("20060102"))

	today = time.Date(2024, 6, 30, 0, 0, 0, 0, time.Local)
	nextDay = today.AddDate(0, -1, 0)
	fmt.Printf("today :%v nextDay :%+v \n", today.Format("20060102"), nextDay.Format("20060102"))

	today = time.Date(2024, 7, 31, 0, 0, 0, 0, time.Local)
	nextDay = today.AddDate(0, -1, 0)
	fmt.Printf("today :%v nextDay :%+v \n", today.Format("20060102"), nextDay.Format("20060102"))

	today = time.Date(2024, 8, 31, 0, 0, 0, 0, time.Local)
	nextDay = today.AddDate(0, -1, 0)
	fmt.Printf("today :%v nextDay :%+v \n", today.Format("20060102"), nextDay.Format("20060102"))

	today = time.Date(2024, 9, 30, 0, 0, 0, 0, time.Local)
	nextDay = today.AddDate(0, -1, 0)
	fmt.Printf("today :%v nextDay :%+v \n", today.Format("20060102"), nextDay.Format("20060102"))

	today = time.Date(2024, 10, 31, 0, 0, 0, 0, time.Local)
	nextDay = today.AddDate(0, -1, 0)
	fmt.Printf("today :%v nextDay :%+v \n", today.Format("20060102"), nextDay.Format("20060102"))

	today = time.Date(2024, 11, 30, 0, 0, 0, 0, time.Local)
	nextDay = today.AddDate(0, -1, 0)
	fmt.Printf("today :%v nextDay :%+v \n", today.Format("20060102"), nextDay.Format("20060102"))

	today = time.Date(2024, 12, 31, 0, 0, 0, 0, time.Local)
	nextDay = today.AddDate(0, -1, 0)
	fmt.Printf("today :%v nextDay :%+v \n", today.Format("20060102"), nextDay.Format("20060102"))

}

输出:

today :20240229 nextDay :20240129
today :20240331 nextDay :20240302
today :20240430 nextDay :20240330
today :20240531 nextDay :20240501
today :20240630 nextDay :20240530
today :20240731 nextDay :20240701
today :20240831 nextDay :20240731
today :20240930 nextDay :20240830
today :20241031 nextDay :20241001
today :20241130 nextDay :20241030
today :20241231 nextDay :20241201

其中,如 20240331、20240531、20240731、20241031 这一些时算的上月时间就出错,它依然是本月的时间。

解决这个问题最简单,最快的方式是引用库 https://github.com/Andrew-M-C/go.timeconv

package main

import (
	"fmt"
	"time"
	"github.com/Andrew-M-C/go.timeconv"
)

func main() {
	t := time.Date(2019, 1, 31, 0, 0, 0, 0, time.UTC)
	nt := t.AddDate(0, 1, 0)	// Add one month
	fmt.Printf("%v\n", nt)		// 2019-03-03 00:00:00 +0000 UTC, not expected

	nt = timeconv.AddDate(t, 0, 1, 0)
	fmt.Printf("%v\n", nt)		// 2019-02-28 00:00:00 +0000 UTC
}

1、令人困惑的 Go time.AddDate https://learnku.com/articles/71760

2、Go time 包中的 AddDate 的逻辑避坑指南 https://cloud.tencent.com/developer/article/1803695

]]>
vscode 插件列表 2024-04-09T21:00:30+00:00 kane http://blog.xyecho.com/vscode-plug-in-list 常有插件

1、Draw.io Integration : https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio 2、Git Graph https://marketplace.visualstudio.com/items?itemName=mhutchie.git-graph 3、sonhero.io tools for VS Code: https://marketplace.visualstudio.com/items?itemName=JSONHero.jsonhero-vscode 4、AI Coding Autocomplete codeium https://marketplace.visualstudio.com/items?itemName=Codeium.codeium 5、Project Manager https://marketplace.visualstudio.com/items?itemName=alefragnani.project-manager 6、golang https://marketplace.visualstudio.com/items?itemName=golang.Go 7、 Markdown Preview Enhanced https://marketplace.visualstudio.com/items?itemName=shd101wyy.markdown-preview-enhanced

Tutorial :https://shd101wyy.github.io/markdown-preview-enhanced/#/zh-cn/

配置

1、https://github.com/kakabei/configbox/tree/main/vscode

]]>
常用命令 git 2024-04-01T19:21:12+00:00 kane http://blog.xyecho.com/frequently-used-command-reference-git 全局配置
git config --gobal core.autocrlf false
git config --global user.name "carlos"
git config --global user.email "1447675994@qq.com"

git init   // 初始化一个仓库

sudo git config --system alias. st status
sudo git config --system alias. ci commit
sudo git config --system alias. co checkout
sudo git config --system alias. br branch

git config --global alias. st status
git config --global alias. ci commit
git config --global alias. co checkout
git config --global alias. br branch
git config --global color. ui true

常用操作


git add  .            # 添加到缓冲区 可以加 参加 -A
git status            #  查看当前状态
git commit -m "XXX"   # 提交代码
git diff              #  查看不同
git log               # 查看日志
git log --pretty=oneline
git reset --hard HEAD^
git rm # 文件名(包括路径) 从git中删除指定文件  # 删除文件

git reflog # 记录你的每一次命令

git checkout -- file. # 可以丢弃工作区的修改  命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令
git reset HEAD file. # 可以把暂存区的修改撤销掉

git remote add origin git@server-name:path/repo-name.git # 要关联一个远程库;
git push -u origin master  # 使用命令第一次推送master分支的所有内容

git clone #  克隆一个本地库:
git clone git@github.com:michaelliao/gitskills.git
git checkout -b dev # 创建dev分支,然后切换到dev分支

git branch  #命令会列出所有分支,当前分支前面会标一个-号
git merge dev  # 把dev分支的工作成果合并到master分支上
git branch -d dev  # 删除dev分支了
git merge --no-ff -m "merge with no-ff" dev  # 合并分支代码 --no-ff参数,表示禁用Fast forward 这样,从分支历史上就可以看出分支信息。

git stash  # Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
git stash apply # 恢复,但是恢复后,stash内容并不删除
git stash drop #来删除
git stash pop,#恢复的同时把stash内容也删了
git branch -D feature-vulcan  #强行删除
 

本地暂存 git stash

git 把 stash 内容存在某个地方了,但是需要恢复一下,有两个办法

  • 一是用git stash apply 恢复,但是恢复后,stash 内容并不删除,你需要用 git stash drop 来删除;
  • 另一种方式是用 git stash pop,恢复的同时把 stash 内容也删了
git stash list [<options>]
git stash show [<stash>]
git stash drop [-q|--quiet] [<stash>]
git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]
git stash branch <branchname> [<stash>]
git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
         [-u|--include-untracked] [-a|--all] [<message>]
git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
         [-u|--include-untracked] [-a|--all] [-m|--message <message>]]
         [--] [<pathspec>…​]]
git stash clear
git stash create [<message>]
git stash store [-m|--message <message>] [-q|--quiet] <commit>git_stash.html

标签

git tag <name>  # 就可以打一个新标签
git tag      # 查看所有标签
git tag v0.9 6224937   #v0.9标签名 6224937 commit id
git show <tagname>  # 查看标签信息 
git tag -d <tagname> # 删除标签
git push origin <tagname> # 可以推送一个本地标签;
git push origin --tags # 可以推送全部未推送过的本地标签;
git tag -d <tagname> # 可以删除一个本地标签;
git push origin :refs/tags/<tagname> # 可以删除一个远程标签。

分支

Git鼓励大量使用分支:

git branch       # 查看分支
git branch <name>  # 创建分支
git checkout <name> # 切换分支
git checkout -b <name>  # 创建+切换分支
git merge <name>   # 合并某分支到当前分支
git branch -d <name> # 删除分支
git branch -v # 查看分支 
git branch A1.0 # 查看分支 
git checkout A1.0 # 切换分支
git branch -d A1.0 # 删除分支   // 如果该分支没有合并到主分支会报错
git branch -D A1.0 # 强制删除

git checkout B  
git merge A   # 把A合并到B中 

git fetch --prune #  刷新本地和远程一样

git push origin feature/1.15.1-kane   // 提交分支
git ckeckout  -b feature/1.15.1-kane # 创建切换分支:

git 提交一个分支,发现远程已经被删除,如何再次提交 可以用 :git push origin develop_2.0.4

Git 撤销合并——如何在 Git 中恢复之前的合并提交

分支合并

比如,如果要将开发中的分支(develop),合并到稳定分支(master),

首先切换的master分支:git checkout master

然后执行合并操作:git merge develop

如果有冲突,会提示你,调用git status查看冲突文件。

解决冲突,然后调用 git addgit rm 将解决后的文件暂存。

所有冲突解决后,git commit 提交更改。

忽略文件.gitignore

在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件 忽略文件的原则是:

  • 忽略操作系统自动生成的文件,比如缩略图等;
  • 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
  • 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore

这个仓库要忽略的文件

  • 忽略所有 .a 结尾的文件 -.a
  • 但 lib.a 除外 !lib.a
  • 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO /TODO
  • 忽略 build/ 目录下的所有文件 build/
  • 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt doc/-.txt
    .project
    .pydevproject
    .settings/
    -.ncb
    -.suo
    -.user
    .cproject
    -.o

撤销修改

未使用 git add 缓存代码

撤销指定文件: git checkout -- filepathname 撤销所有的文件修改可以使用 git checkout . 对新建文件无效

已经使用了  git add 缓存了代码

撤销指定文件:  git reset HEAD filepathname 撤销所有的文件修改可以使用  git reset HEAD . 清除 git  对于文件修改的缓存。相当于撤销 git add 命令所在的工作。

已经用 git commit  提交了代码

来回退到上一次commit的状态 git reset --hard HEAD^ 

此命令可以用来回退到任意版本:git reset --hard  commitid

基于 Merge Request 的开发流程 : https://wikinote.gitbook.io/git-learning/gitlab-cao-zuo/gitlab-merge-request 如何撤销 Merge Request?https://wikinote.gitbook.io/git-learning/gitlab-cao-zuo/gitlab-merge-request-revert

.gitconfig 配置

[core]
        repositoryformatversion = 0
        filemode=true
        bare=false
        logallrefupdates=true
        symlinks=false
        ignorecase=true
        hideDotFiles=dotGitOnly
        autocrlf=true
        quotepath=false

[remote "origin"]
        url = https://github.com/alonegarden/alonegarden.github.io.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
[user]
        name=cxxlxx
        email=xxxxxxxxxx@qq.com
[color]
        ui=true
[alias]
        co=checkout
        ci=commit
        br=branch
        st=status
        last=log -1
        lg="log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' --abbrev-commit --date=relative"
        lgo="log origin/master --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' --abbrev-commit --date=relative"

遇到的问题

git add . 之后出现 :

The file will have its original line endings in your working directory

要设置一下 git config --global core.autocrlf false

github

协议: github常见开源协议概括

表情:https://github.com/zhouie/markdown-emoji 数据牌是一种轻量级的徽章: https://shields.io/

GitHub CI Gem Version npm version

<p align="center">
<img src="https://github.com/crispgm/resume/workflows/build/badge.svg" alt="GitHub CI" />
<a href="https://badge.fury.io/rb/jekyll-theme-minimal-resume">
<img src="https://badge.fury.io/rb/jekyll-theme-minimal-resume.svg" alt="Gem Version" />
</a>
<a href="https://badge.fury.io/js/hexo-theme-crisp-minimal-resume">
<img src="https://badge.fury.io/js/hexo-theme-crisp-minimal-resume.svg" alt="npm version" />
</a>
</p>

例子 : https://github.com/kakabei/jekyll-resume

多帐号配置

由于我同时使用了github和码云。所以必须同时配置两个git帐号。 我的所在的环境是windows. (想必linux下也是如此)

$ cd C:\Users\xxxx\.ssh

$ ssh-keygen -t rsa -C "youremail@xx.com"  

Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/xxxx/.ssh/id_rsa): ym
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in ym.
Your public key has been saved in ym.pub.

要在 Enter file in which to save the key (/c/Users/xxxx/.ssh/id_rsa) 后输入你的文件名。 在C:/Users/xxxx/.ssh下:(xxxx为用户名) 创建一个config文件,(注意没有后缀)

Host github.com  
    HostName github.com  
    PreferredAuthentications publickey  
    IdentityFile ~/.ssh/id_rsa  
  
Host git.oschina.net 
    HostName git.oschina.net  
    PreferredAuthentications publickey  
    IdentityFile ~/.ssh/ym 
]]>
常用命令 curl 2024-04-01T19:21:12+00:00 kane http://blog.xyecho.com/frequently-used-command-reference-curl curl 常见的技巧

github 地址:https://github.com/curl/curl

参数:

-o <file>    # --output: 写入文件
-u user:pass # --user: 验证
-v           # --verbose: 在操作期间使 curl 冗长
-vv          # 更冗长
-s           # --silent: 不显示进度表或错误
-S           # --show-error: 与 --silent (-sS) 一起使用时,显示错误但没有进度表
-i           # --include: 在输出中包含 HTTP 标头
-I           # --head: 仅标头

数据:

# --data: HTTP post 数据
# URL 编码(例如,status="Hello")
-d 'data'

# --data 通过文件
-d @file

# --get: 通过 get 发送 -d 数据
-G

头信息 Headers:

-A <str>     # --user-agent
-b name=val  # --cookie

# 从 URL 的指定文件加载 cookie
-b, --cookie FILE
# 将 cookie 从 URL 保存到指定文件
-c, --cookie-jar FILE

-b FILE          # --cookie
-H "X-Foo: y"    # --header
--compressed     # 使用 deflate/gzip 

ssl :

    --cacert <file>
    --capath <dir>
-E, --cert <cert>     # --cert: 客户端证书文件
    --cert-type       # der/pem/eng
-k, --insecure        # 对于自签名证书

示例

1、GET 请求

curl -I https://www.baidu.com                                          # curl 发请求
curl -v -I https://www.baidu.com                                       # 带有详细信息的 curl 发请求
curl -X GET https://www.baidu.com                                      # 使用显式 http 方法进行 curl
curl --noproxy 127.0.0.1 http://www.stackoverflow.com                  # 没有 http 代理的 curl
curl --connect-timeout 10 -I -k https://www.baidu.com                  # curl 默认没有超时
curl --verbose --header "Host: www.mytest.com:8182" www.baidu.com      # curl 得到额外的标题
curl -k -v https://www.google.com                                      # curl 获取带有标题的响应

2、POST 请求

url -d "name=username&password=123456" <URL>    # curl 发请求
curl <URL> -H "content-type: application/json" -d "{ \"woof\": \"bark\"}"    # curl 发送 json

3、高级用法

curl -L -s http://ipecho.net/plain, curl -L -s http://whatismijnip.nl            # 获取我的公共 IP撒··
curl -u $username:$password http://repo.dennyzhang.com/README.txt                # 带凭证的 curl
curl -v -F key1=value1 -F upload=@localfilename <URL>                            # curl 上传
curl -k -v --http2 https://www.google.com/                                       # 使用 http2 curl
curl -T cryptopp552.zip -u test:test ftp://10.32.99.187/                         # url ftp 上传
curl -u test:test ftp://10.32.99.187/cryptopp552.zip -o cryptopp552.zip    curl  # ftp 下载
curl -v -u admin:admin123 --upload-file package1.zip http://mysever:8081/dir/package1.zip    # 使用凭证 curl 上传

4、查询当前机器的出口IP

 (base) C:\tools> curl cip.cc
IP      : 121.12.81.78
地址    : 中国  广东  江门
运营商  : 电信

数据二  : 广东省深圳市 | 电信

数据三  : 中国广东省深圳市 | 电信
URL     : http://www.cip.cc/121.12.81.78

]]>
python mysql 插入更新一些特殊的字符 2024-03-09T09:08:12+00:00 kane http://blog.xyecho.com/python-mysql-connector 写了一个脚本,把一个mysql 表的中数据从一个表更新到另一个表中。其他有字段是路径,包含有 /' 等字符。

第一次的做法是:

    sql = "update t_softname set icon=%s, start_cmd=%s where name=%s".format(icon, link, name)
    cursor.execute(sql) 

却发现了问题,就是在遇到特殊的字符会被转义。如:写入的路径后会没了斜杠 \。或遇到 ' 出现 sql 解析异常。

这是字符串被转义导致的。

使用参数化查询才可以,如下:


    sql = "update t_softname set icon=%s, start_cmd=%s where name=%s"
    cursor.execute(sql,(icon, link, name))  
]]>
《月亮与六便士》 毛姆 2023-06-01T19:13:00+00:00 kane http://blog.xyecho.com/月亮与六便士

]]>
《面纱》 毛姆 2023-05-27T19:13:00+00:00 kane http://blog.xyecho.com/面纱

我最不喜欢的就是讲人性,但很多故事也是深刻的讲人性才有了冲突和升华。

《面纱》让人知道,我们看到人和事物就是人性上装饰的面纱,一切感觉很美好,和谐。可面纱之下才是真实的人性丑恶,很多人没看到过,很多人不相信人性如此,很多人就是喜欢表面的面纱。

人生的常态是什么,是无论你喜欢否,知道否,面纱一直存在。大部分人并知道真实是什么,也不想知道真实是什么。

这书和毛姆《月亮与六便士》、《刀锋》重点不一样。对比之下,《刀锋》和《月亮与六便士》更喜欢些吧。我不喜欢探讨太多的人性。

]]>
《刀锋》 毛姆 2023-05-02T19:13:00+00:00 kane http://blog.xyecho.com/刀锋

拉里一直在追寻他活着的意义,在救赎自己,也在救赎身边的人。 最终,他也不知道是否已经找到,或许找不到,或许根本没有。但他放下了,或说顿悟了。 至此,他又回到了世俗的生活。却也不是当初的自己了。

感觉他什么都可以放下,什么都可以不在意。不知道在空军时他好友的死给他带来了什么样的冲击。他才开始他与众不同的道路。

总有人追求自己的世界,总有人的生活有别于世俗世界。

《月亮与六便士》的斯特里克兰同样走这不同于世俗的道路,但如疯狂,如疯子变态。不被世俗理解甚至被嘲笑厌恶。相比之下拉里的道路不被理解,但也温柔很多。

斯特里克兰追求表达自己,拉里追求救赎自己。

不明白为什么有那么多人喜欢当“人生导师”,肆无忌惮的指点和批评别人的生活或人生呢。可能最俗的人就是你自己。

人是可以有很多不同的道路去走,同样也应该宽容你身边的人的各种格格不入的生活态度和行为举止。可能他在救赎自己。

]]>
软件工程文化的思考 2023-02-12T10:12:15+00:00 kane http://blog.xyecho.com/think-about-software-engineering 1、编程是指写代码的直接行为。

2、软件工程用构建和维护代码的工具和流程, 保持代码的长期价值。因为涉及到流程,所以软件工程更多的团队行为。

3、软件工程的最佳实践: 可持续、规模化。

4、团队的协作,沟通是手段,业务产出才是目的。

5、协同和评审是依赖团队保证自己在正确路上。

6、团队可以让我们获得集体智慧。

7、团队应该有一个安全环境或容错空间,让新人有信心提出问题。

8、沟通时,要分清对方是意图、事实、情绪,还是期待。

9、导师的三个能力: 一、熟悉团队流程和系统的经验; 二、向其他人解释事情的能力; 三、评估对方需要多少帮助的能力,主动询问帮助,不要过度唠叨。

]]>