我到今天才知道,原来我在写代码的时候是这样的状态

作为一个软件开发工程师,写代码必然是第一技能。写代码,不应该只是一份工作,而是在为社会创作一件流芳百世的艺术品。艺术创作,就一定会有境界,那么一个人写代码的境界,这儿总结一个简单的从低到高梯度。

                             

“我的代码写完了”

接到任务,便开始和一个生产线上的工人一样,一行一行的写,没有计划,想到哪写到哪,什么代码风格,算法是不是最优,别人能不能看懂,都不管了。写完了,编译通过了,能运行了,告诉老板,“我的代码写完了”,就匆匆交差。质量怎么样,那是测试的事情。大不了,有了bugs,再来fix。看着快,反反复复,实际上是慢。这是最低层次的境界。

“我的代码写好了”

接到任务,首先计划一下,有几个模块,有几个功能,然后按照规定的代码风格,一个一个模块的完成,也会尝试选择好的优化算法,会加上注释以便自己和别人能够读懂和维护,写完后自己会多看几遍有没有什么问题。毕竟人很难一次把事情都搞对,检查是必不可少的一个环节。编译的时候,会注意每一个warnings,fix它们。也会自己想几个测试用例跑跑,感觉没有问题,就提交,告诉老板,“我的代码写好了”。这个境界高了不少。

“我的代码能用了”

接到任务,除了按上面的方式来写代码。还会在写代码的过程,加入各种白盒测试,也就是说,每写完一个函数,一个功能,会写一段单元测试,来验证自己的代码在各种正常和边缘情况,都能正确无误的运行。同时还会注意测试的代码覆盖率,也就是说,每一行代码都会有测试场景跑过。如果是使用了别的服务,会将别的服务mockup起来,让自己的系统能正确的运行。对于之上的模块,系统,有集成测试,有回归测试。虽然在写代码的过程中,加大了工作量,但是这样的代码,出错的概率明显减少,中间需要的来来回回修复的次数明显减少,实际上是减少了总的工作量,节约了项目的时间。这是一种负责任的态度,也是一个工程师本应具备的基本素质。这个境界就很高级了。

“我的代码还在用”

代码像艺术品,好的艺术品,流芳百世,好的代码,也应该如此。那么,工程师对代码也应该像创作一个艺术品,深思熟虑,精雕细刻,期望它们能够在产品中永生下去。当你老了的时候,还能骄傲的告诉人们,“我的代码还在用”。这样就要求代码写的好,写的质量高,考虑全面,运行效率高,几乎没有bugs,而且容易读懂,容易维护,容易使用,千锤百炼。举个例子,如果实现一个功能,有不同的算法,会写代码实验不同算法在此场景下的性能,对比优缺点,选择一个合理高效的算法使用。这样的工作,除了后人发明了更好的算法,否则是不容易被替换掉的。写代码是一门艺术,写出来的代码就是一个艺术品。这样的境界,是每个程序员应该追求的最高目标。

只有心底里有“对自己的代码负责”的思维,才能达到最高的境界“我的代码还在用”。而“对自己的代码负责”应该是每一个工程师的基本素质。这样,写出的代码,才有可能成为一件艺术品,流芳百世。

“What is your legacy?”,代码,可能会是程序员给社会留下的一份资产。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基本的 C++ 生命游戏代码,包含了所要求的自定义函数: ```c++ #include <iostream> #include <vector> #include <cstdlib> #include <ctime> using namespace std; class GameOfLife { public: GameOfLife(int rows, int cols) : rows_(rows), cols_(cols), cur_(rows, vector<int>(cols)), next_(rows, vector<int>(cols)) {} void run() { // 计算下一代细胞状态 for (int i = 0; i < rows_; ++i) { for (int j = 0; j < cols_; ++j) { int count = countNeighbors(i, j); if (count == 3 || (cur_[i][j] == 1 && count == 2)) { next_[i][j] = 1; } else { next_[i][j] = 0; } } } // 更新当前状态 cur_ = next_; } void display() { for (int i = 0; i < rows_; ++i) { for (int j = 0; j < cols_; ++j) { cout << (cur_[i][j] == 1 ? "X" : "-") << " "; } cout << endl; } cout << endl; } void init() { srand(time(nullptr)); for (int i = 0; i < rows_; ++i) { for (int j = 0; j < cols_; ++j) { cur_[i][j] = rand() % 2; } } } private: int countNeighbors(int x, int y) { int count = 0; for (int i = -1; i <= 1; ++i) { for (int j = -1; j <= 1; ++j) { if (i == 0 && j == 0) continue; int nx = x + i, ny = y + j; if (nx >= 0 && nx < rows_ && ny >= 0 && ny < cols_) { count += cur_[nx][ny]; } } } return count; } int rows_; int cols_; vector<vector<int>> cur_; vector<vector<int>> next_; }; int main() { int rows, cols; cout << "请输入网格的行数和列数:"; cin >> rows >> cols; GameOfLife game(rows, cols); game.init(); game.display(); while (true) { cout << "按任意键继续,输入 q 退出:"; char c; cin >> c; if (c == 'q' || c == 'Q') break; game.run(); game.display(); } return 0; } ``` 在该代码中,我们使用了一个二维向量来表示网格,其中 `cur_` 表示当前状态,`next_` 表示下一代状态。在 `run()` 函数中,我们计算了每个格子周围的细胞数量,并根据规则更新下一代状态,然后将 `next_` 赋值给 `cur_`,从而完成一次演化。在 `display()` 函数中,我们将当前状态打印出来。在 `init()` 函数中,我们随机初始化了网格。 程序运行时,先要求用户输入网格的行数和列数,然后进行初始化,并展示当前状态。接下来,程序进入一个无限循环,每次循环等待用户按下任意键,然后计算并展示下一代状态。用户可以在任何时候输入 `q` 或 `Q` 退出程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值