不,我不会这么干的,这么做不专业

面对紧急且看似简单的修改请求,如何保持编程的专业性?本文分享了一种应对策略,并强调了维护代码质量和可维护性的重要性。

“哦,对,需求说明书上有点问题,但我们需要马上去做这个东西。系统上线时少不了它。每个人都需要它。它只是个小小的改动。这一定很容易办到,你们很快就能做出来。”

-项目经理

你跟项目经理、市场人员一起坐在会议室里。你听着他们根据著名的“need, must, easy, fast”猜想而得出的要求。你该怎么回答?你被逼到了墙角。

在这样的会议后,你们有多少人昧着良心做了违反开发原则的编程活动?有多少人明知这样图省事、抄近道的做法会成为将来做大的麻烦却还是做了?

我就这样干过。

 

幸运的是,经过这些年,我多少也学会说些“不”了。

“老大,我不建议现在做这种修改。这样做显得不是很专业。如果我们现在做了这样的修改,虽然完成的很快,但总有一天会需要有人把它改成正确的方式。我不愿为将来这个人制造这种麻烦。

然而,我不是老板,如果我们非要按这种方式做,我建议我们必须至少花几个小时的时间为这个问题写一些文档说明,开发一个自动功能测试单元,来提示我们这个问题依然存在。如果你认为这是个如此重要的功能,我们是否该在之后花上一两天时间把事情改正确呢?“

通常这样说会起作用。如果不行,这就到了把事情提到另外一个层面上的时候了。”那好,你真的希望我这样不专业的做事吗?“。

程序员们,每次我们使用没有意义的变量名称都是对我们的同事的一次伤害。每次我们抛出一个毫无意义的错误提示、或没有对这个错误进行标注说明,都是对技术支持团队的一次伤害。每次我们写程序不写文档、图省事抄近道,最终都是对参与这个软件开发的所有人的一次伤害。

如果我记得没错的话,人们在取得行医资格时的希波克拉底誓言中有这样的话:

我会根据我的能力和我的判断为我的病人开出有益的药方,绝不做对他们有害的事情。

能把一个专业的开发者的工作跟一个专业医师的工作相对比吗?很多人并不认为它们是对等的。然而,现在医生们使用的那些工具可都是开发人员为他们开发出来的。

你是用什么方法来防止自己被”强迫“做那些不专业的工作的呢?

 

 

 

翻译来源:外刊IT评论

 

 

:-)

<think> 我们参考之前的对话历史和引用的文献来回答用户的问题。 用户是一位老奶奶,她看懂`return st.empty();`的作用,要求用C++解释。 根据引用[2]:stl中empty_C ++ STL中的set :: empty()函数。set::empty() function is a predefined function, it is used to check whether a set is empty or not. If set is empty it returns true (1), if set is not empty it returns false (0). [^2] 也就是说,`empty()`是一个预定义的成员函数,用于检查容器(如栈、集合等)是否为空。如果为空则返回true,否则返回false。 另外,引用[1]和[3]中都有使用栈的示例,其中`while (!st.empty())`用于循环直到栈为空。 因此,我们可以这样解释: 在C++中,`st.empty()`是栈(stack)或其他STL容器(如set, vector等)的一个成员函数,用于判断容器是否为空。当容器中没有任何元素时,它返回`true`;否则返回`false`。 那么,`return st.empty();`的意思就是:返回栈(或其他容器)`st`是否为空的状态(true或false)。 我们还可以结合引用[5]中的队列实现代码,其中有一个`empty()`成员函数: ```cpp bool empty() { return (shuru.empty() && shuchu.empty()); } ``` 这里也是返回两个栈是否都为空的状态。 因此,我们可以用简单的语言向老奶奶解释: 这个语句的作用是:检查一个叫`st`的容器(比如一个装数据的箱子)是是空的。如果这个容器里面什么都没有,那么`st.empty()`就会返回`true`(真);如果里面还有东西,就返回`false`(假)。而`return`则是把这个结果返回给调用这个函数的地方。 举个例子: 假设我们有一个栈`st`,它就像一叠盘子。我们想知道这叠盘子是否被拿空了,就可以用`st.empty()`来检查。如果返回`true`,说明没有盘子了;返回`false`,说明还有盘子。 在代码中,我们可能会这样用: ```cpp #include <iostream> #include <stack> using namespace std; // 这个函数用来判断栈是否为空,并返回结果 bool isStackEmpty(stack<int> st) { return st.empty(); // 这里就是返回栈st是否为空 } int main() { stack<int> st; // 创建一个栈 // 检查栈是否为空,此时应该是空的 cout << "栈是否为空?" << isStackEmpty(st) << endl; // 输出1(true) st.push(10); // 往栈里放一个数字10 // 再检查一次 cout << "栈是否为空?" << isStackEmpty(st) << endl; // 输出0(false) return 0; } ``` 注意:在C++中,布尔值`true`输出为1,`false`输出为0(默认情况下)。如果想输出true和false字符串,可以使用`boolalpha`。 所以,`return st.empty();`就是返回容器是否为空的状态,以便于我们在其他地方使用这个信息。 同时,我们也注意到引用[3]中有一个循环条件同时使用了`!st.empty()`和`st.size()!=0`,实际上这两个是等价的,因为`empty()`的实现通常就是检查`size()==0`。但是使用`empty()`是更推荐的方式,因为对于某些容器,`empty()`可能比`size()`更高效(比如list,但stack底层通常是deque,其实效率差多)。 因此,我们可以总结:`return st.empty();`的作用是返回容器`st`是否为空,这是一个快速且常用的操作。 最后,我们生成相关问题: </think> ### C++ 中 `return st.empty();` 的作用详解(用奶奶能懂的方式解释) #### 通俗解释 🌸 想象你有一个装饼的盒子(这个盒子就是 `st`)。`st.empty()` 就是让你**检查盒子里还有没有饼**: - 如果盒子空了 👉 返回 `true`(真) - 如果还有饼 👉 返回 `false`(假) `return st.empty();` 的意思就是:**把这个检查结果告诉用饼盒的人**。比如告诉厨房:"盒子空了哦,该烤新饼啦!" --- #### 实际代码示例 🍪(结合引用[1][3][5]) ```cpp #include <iostream> #include <stack> // 需要包含栈的头文件 // 定义一个检查饼盒的函数 bool isCookieJarEmpty(std::stack<std::string>& cookieJar) { return cookieJar.empty(); // 重点在这里! } int main() { // 1. 创建一个饼盒(栈) std::stack<std::string> st; // 2. 放三块饼进去 st.push("巧克力饼"); st.push("杏仁饼"); st.push("奶油饼"); // 3. 检查盒子是否空了? if (isCookieJarEmpty(st)) { std::cout << "盒子空啦,快新饼!\n"; } else { std::cout << "盒子里还有 " << st.size() << " 块饼呢\n"; // 输出:盒子里还有 3 块饼呢 } // 4. 模拟吃光饼(引用[1][3]的用法) while (!st.empty()) { std::cout << "正在吃:" << st.top() << "\n"; st.pop(); // 吃掉最上面的饼 } // 5. 再次检查盒子 std::cout << "吃完后盒子空了吗? " << std::boolalpha << isCookieJarEmpty(st); // 输出:true } ``` --- #### 关键技术点 🔍(根据引用[2][5]) 1. **`empty()` 是什么?** - 是 C++ 栈(`stack`)自带的检查功能 - 就像饼盒的"透视眼" 👀,能看里面有没有东西 2. **`return` 的作用** 把检查结果传递给需要的人: ```cpp // 厨房收到结果后的反应 if (isCookieJarEmpty(st)) { bakeNewCookies(); // 调用烤饼函数 } ``` 3. **实际应用场景**(引用[5]的队列实现) ```cpp class MyQueue { public: bool empty() { // 同时检查两个"饼盒" return (shuru.empty() && shuchu.empty()); } private: std::stack<int> shuru; // 输入盒 std::stack<int> shuchu; // 输出盒 }; ``` --- #### 为什么这样设计? 🧠 1. **效率高**:检查盒子比数饼(`size()`)更快 2. **安全**:不会碰坏饼(避免操作空盒子报错) 3. **通用**:所有容器(盒子/篮子/袋子)都能用 `empty()` > 💡 小贴士:在循环中常用 `while (!st.empty())` 来安全地处理数据,就像把饼一块块拿出来吃,直到盒子空为止[^1][^3]。 --- #### 常见问题解答 ❓ 1. **能换成 `return (st.size() == 0);` 吗?** 可以,但专业厨师都用 `empty()`,因为它更快更直接! 2. **如果盒子存在怎么办?** 编译器会提醒你:"奶奶,这个饼盒还没买呢!"(编译错误) 3. **其他容器能用吗?** 当然!装水果的篮子(`vector`)、装纽扣的罐子(`set`)都能用这个方法检查[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值