最近我试图向我的项目经理解释一些设计不佳的代码。所有管理器类都是单例(“这就是为什么我不能轻易更改它”),并且代码在函数调用就足够的地方使用事件分派(“这就是为什么它很难调试”)。遗憾的是,它只是一团乱七八糟的英语。

作为一名程序员,您必须向非技术人员传达的最困难的事情是什么?您是否找到任何类比或解释方式可以使其更清楚?

有帮助吗?

解决方案

线程同步和死锁。

其他提示

花时间进行设计,并花时间进行重构。

重构根本不会产生客户可见的工作,这使得项目中最难以证明工作的合理性。

作为第二个“不是客户可见的”问题,单元测试。

我被问到互联网是如何工作的 - 我回答“SYN,ACK,ACK”。不要忘记它是SYN,SYN-ACK,ACK ..


(来源: inetdaemon.com

我最难的问题是天真地开始:我的女朋友询问如何在Firefox中呈现文本。我简单回答了“渲染引擎,Gecko,HTML解析器,等等等等。”

然后它走下坡路。 “那么Gecko如何知道该展示什么呢?”

它从那里逐渐下降到图形驱动程序,操作系统,编译器,硬件组合以及原始的1和0。我不仅意识到自己对分层结构的了解存在重大差距,而且最终还是让我(和我!)比我开始时更加困惑。

我应该最初回答“乌龟一直向下”。并坚持下去。 :P

我有一个有趣的案例,试图解释为什么当数据库中的某些记录有空字符串且有些记录为NULL时程序没有按预期运行。当我告诉他们空字符串只是一个包含0个字节的字符串时,我认为他们的头部爆炸了,而NULL意味着未知值,所以你实际上无法将它与任何东西进行比较。

之后我有一次令人讨厌的头痛。

1。)SQL:在集合中思考,而不是在程序上思考(这对我们的程序员来说很难掌握!)。

2。)......这是揭开技术概念神秘面纱的一个很好的例子:

我如何向妻子解释REST

许多以开头的语句“这是因为在Oracle中,......”出现在我的脑海中。

最大的障碍是围绕“技术债务”,尤其是关于该版本的架构如何正确但需要针对下一版本进行更改。这类似于解释“原型与生产”的问题。和“版本1.0与版本2.0”。

我犯过的最糟糕的错误是在NeXT步骤UI Builder中进行UI模型。 看起来与最终产品看起来完全一样,并且有一些行为。试图解释在那之后剩下6个月的工作是非常困难。

“在一个月内为这个迟到的任务添加一个新程序员将使其稍后发布。没关系,请阅读本书。“ (神话人月。)经理仍然不太明白。

为什么这样的代码很糟糕:

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 $#@%#
}

单元测试的重要性。

递归的概念 - 有些人真的很难。

我有时候很难解释协方差/逆变的概念以及与其他程序员有关的问题。

让朋友确信我开发的Facebook应用程序真的不存储她的个人数据(例如姓名),即使仍然显示它。

为什么还需要四周才能将此应用投入生产。毕竟,只需要一个星期的时间来完成快速原型。它“有效” (或者至少看起来像这样)所以我应该完成,不应该吗?

涉及安全性,代码质量(可维护性),规范化数据库模式,测试等的解释通常作为一个对应用程序没有任何明显影响的抽象列表,所以很难解释它们到底是什么为项目做出贡献以及为什么需要这些项目。有时类比只能带你到目前为止。

C指针

* I

&安培;我

在多线程环境中避免死锁。

我通过在白板上直观地解释它,画出两条平行线并显示当同时到达相同点时会发生什么来清除混乱。

还与我正在解释它的人一起角色扮演两个线程,并使用物理对象(书籍,咖啡杯等)来展示当我们一次尝试使用某些东西时会发生什么。

对于这一点,确实没有正确或错误的答案......这都是经验。

我必须向非技术人员解释的最困难的事情是,为什么他在国外旅行时无法访问他的网站,但他住在那里的家庭成员(提供者完全不同)可以得到它。不知何故,“在芬兰失败”不够好。

向人们解释的最困难的概念我将标记程序员而不是开发人员是面向对象设计的一些最核心范例。最具体的是抽象,封装和王,多态以及如何正确使用它们。

扩展这是解释控制反转是什么以及为什么它是绝对需要的复杂程度,而不仅仅是没有做任何事情的额外代码层。

我本来想对 Mikael 的帖子发表评论,有些人只是采用顺序编程,但不幸的是,他们只是坚持这样做。

但这实际上意味着:两个非常难以解释的概念:

  • haskell 中的 monad(通常以:“这就像一个函数,它返回一个函数,该函数可以完成您真正想做的事情,但是......”)
  • 在扭曲/蟒蛇中延迟(“这就像......呃……只要使用它一年左右,你就会得到它”;))

试图解释为什么代码按顺序执行。对于一些非程序员(即我的女朋友)来说,这似乎并不直观。

在大多数情况下,当您使用UTF-8字符串时,为什么不需要字符正确的索引处理。

很难解释为什么大多数软件都有错误。许多非技术人员不知道软件是多么复杂,以及忽视意外情况是多么容易。他们认为我们太懒了,无法修复我们知道已破坏的东西。

世界上有10种不同类型的人。

了解Binary的人和不喜欢的人....

说白了,为什么发展是人类暴露的最难的概念。与任何编程语言无关,但总的来说。不,我不是试图为自己或你提供自我提升,这个领域唯一真正的限制是你的头脑。

为什么呢?我们不使用常数而且没有边界,人类认为人类的AI不存在的唯一原因还在于我们自身的局限性。所有其他方面都需要遵守某种法律,发展不关心物理定律或任何法律,因此称发展......进化。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top