最近我试图向我的项目经理解释一些设计糟糕的代码。所有的管理器类都是单例(“这就是为什么我不能轻易改变它”)并且代码使用事件调度,函数调用就足够了(“这就是为什么它很难调试”)。可悲的是,它刚刚出现了一堆笨拙的英语。
您作为程序员向非技术人员传达的最困难的事情是什么?您是否发现任何类比或解释方法使其更清晰?
答案 0 :(得分:30)
线程同步和死锁。
答案 1 :(得分:25)
花时间进行设计,并花时间进行重构。
重构根本不会产生客户可见的工作,这使得项目中最难以证明工作的合理性。
作为第二个“非客户可见”问题,单元测试。
答案 2 :(得分:18)
我被问到互联网是如何工作的 - 我回答“SYN,ACK,ACK”。不要忘记它是SYN,SYN-ACK,ACK ..
(来源:inetdaemon.com)
答案 3 :(得分:14)
我最困难的问题开始得天真无邪:我的女朋友询问如何在Firefox中呈现文本。我简单回答了“渲染引擎,Gecko,HTML解析器,等等等等。”
然后它走下坡路。 “那么Gecko如何知道该展示什么?”
它从那里逐渐下降到图形驱动程序,操作系统,编译器,硬件组合以及原始的1和0。我不仅意识到自己对分层结构的了解存在重大差距,而且最终还是让我(和我!)比我开始时更加困惑。
我应该最初回答“乌龟一路走下去”并坚持下去。 :P
答案 4 :(得分:11)
我有一个有趣的案例,试图解释为什么当数据库中的某些记录有空字符串且有些记录为NULL时程序没有按预期运行。当我告诉他们空字符串只是一个包含0个字节的字符串时,我认为他们的头部爆炸了,而NULL意味着未知值,所以你实际上无法将它与任何东西进行比较。
之后我有一次令人讨厌的头痛。
答案 5 :(得分:10)
答案 6 :(得分:9)
最大的障碍是围绕“技术债务”,尤其是关于该版本的架构是如何正确的,但需要针对下一版本进行更改。这类似于解释“原型与生产”和“1.0版与2.0版”的问题。
我犯过的最糟糕的错误是在NeXT步骤UI Builder中进行UI模型。 看起来与最终产品看起来完全一样,并且有一些行为。试图解释在那之后剩下6个月的工作是非常困难。
答案 7 :(得分:9)
我想到了很多以"It's because in Oracle, ..."
开头的陈述。
答案 8 :(得分:6)
答案 9 :(得分:5)
“每月为这个迟到的任务添加一个新的程序员将使它稍后出货。没关系,请阅读本书。” (神话人月。)经理仍然不太明白。
答案 10 :(得分:5)
为什么这样的代码很糟糕:
private void button1_Click(object sender, EventArgs e)
{
System.Threading.ThreadStart start =
new System.Threading.ThreadStart(SomeFunction);
System.Threading.Thread thread = new System.Threading.Thread(start);
_SomeFunctionFinished = false;
thread.Start();
while (!_SomeFunctionFinished)
{
System.Threading.Thread.Sleep(1000);
}
// do something else that can only be done after SomeFunction() is finished
}
private bool _SomeFunctionFinished;
private void SomeFunction()
{
// do some elaborate $#@%#
_SomeFunctionFinished = true;
}
更新:此代码应的内容:
private void button1_Click(object sender, EventArgs e)
{
SomeFunction();
// do something else that can only be done after SomeFunction() is finished
}
private void SomeFunction()
{
// do some elaborate $#@%#
}
答案 11 :(得分:4)
单元测试的重要性。
答案 12 :(得分:3)
递归的概念 - 有些人真的很难。
答案 13 :(得分:2)
我有时候很难解释协方差/逆变的概念以及与其他程序员有关的问题。
答案 14 :(得分:2)
为什么还需要四周才能将此应用投入生产。毕竟,只需要一个星期的时间来完成快速原型。它“有效”(或至少看起来像它)所以我应该完成,不应该吗?
涉及安全性,代码质量(可维护性),规范化数据库模式,测试等的解释通常作为一个对应用程序没有任何明显影响的抽象列表,所以很难解释它们到底是什么为项目做出贡献以及为什么需要这些项目。有时类比只能带你到目前为止。
答案 15 :(得分:2)
让朋友确信我开发的Facebook应用程序真的不存储她的个人数据(例如姓名),即使仍然显示它。
答案 16 :(得分:2)
C指针
* I
&安培;我
答案 17 :(得分:1)
向人们解释的最困难的概念我将标记程序员而不是开发人员是面向对象设计的一些最核心范例。最具体的是抽象,封装和王,多态以及如何正确使用它们。
扩展这是解释控制反转是什么以及为什么它是绝对需要的复杂程度,而不仅仅是没有做任何事情的额外代码层。
答案 18 :(得分:1)
对于这一点,确实没有正确或错误的答案......这都是经验。
我必须向非技术人员解释的最困难的事情是,为什么他在国外旅行时无法访问他的网站,但他住在那里的家庭成员(提供者完全不同)可以得到它。不知何故,“芬兰的失败”还不够好。
答案 19 :(得分:1)
在多线程环境中避免死锁。
我通过在白板上直观地解释它,绘制出两条平行线并显示当同时到达相同点时会发生什么来清除混乱。
还与我正在解释它的人一起角色扮演两个主题,并使用物理对象(书籍,咖啡杯等)来展示当我们一次尝试使用某些东西时会发生什么。
答案 20 :(得分:1)
我打算评论Mikael的帖子,有些人只是接受顺序编程,不幸的是只留下来。
但这确实意味着:两个很难解释的概念:
答案 21 :(得分:0)
试图解释为什么代码按顺序执行。对于一些非程序员(即我的女朋友)来说,这似乎并不直观。
答案 22 :(得分:0)
在大多数情况下,当您使用UTF-8字符串时,为什么不需要字符正确的索引处理。
答案 23 :(得分:0)
很难解释为什么大多数软件都有错误。许多非技术人员不知道软件是多么复杂,以及忽视意外情况是多么容易。他们认为我们太懒了,无法修复我们知道已破坏的东西。
答案 24 :(得分:0)
世界上有10种不同类型的人。
了解Binary的人和不喜欢的人....
答案 25 :(得分:0)
说白了,为什么发展是人类暴露的最难的概念。与任何编程语言无关,但总的来说。不,我不是试图为自己或你提供自我提升,这个领域唯一真正的限制是你的头脑。
为什么呢?我们不使用常数而且没有边界,人类认为人类的AI不存在的唯一原因还在于我们自身的局限性。所有其他方面都需要遵守某种法律,发展不关心物理定律或任何法律,因此称发展......进化。