这非常困难。你和你的环境 斯特凡诺博里尼 描述非常准确。我认为有三个关键因素可以传播这种情况。
的 短期思考。 强> 短期思维是常态的原因有几个,其中大多数已经由斯特凡诺很好地解释了。除了发布的巨大压力和对软件创建缺乏认可外,我还要强调短期合同的数量。由于合同期为2 - 3年,更多初级学者(博士生和博士后)花费任何时间来规划长期软件策略的好处很少。就长期项目而言,例如那些基于常任员工的模拟代码,我已经看到了基本软件工程的一些应用,比如简单版本控制,标准测试用例等。但即使在这些情况下,项目管理也是非常原始的。
的 缺乏正式的培训和经验。 强> 这是一个严重的障碍。在天文学和天体物理学中,编程是一个必不可少的工具,但是对开发成本的理解,特别是维护开销,是非常差的。因为科学家通常都是聪明人,所以有一种感觉,即软件工程实践并不真正适用于他们,并且他们可以“只是让它工作”。凭借更多的经验,大多数程序员意识到编写主要工作的代码并不是困难的部分;有效和安全地维护和扩展它。一些科学代码是一次性的,在这些情况下,快速和肮脏的方法是足够的。但很多时候,代码将在未来几年内被使用和重用,从而给所有参与其中的人带来悲痛。
的 毕业生/博士后不断进行新的发展。 强> 我认为这是允许软件学术方法继续生存的关键特性。如果代码是可怕的,需要花费数天才能理解和调试,谁支付这个价格?一般来说,它不是原作者(可能已经移动过)。它也不是常任的工作人员,往往只是外围参与新的发展。通常是研究生正在实施新算法,产生新方法,试图以某种方式扩展代码。有时它会成为博士后,专门为现有代码添加某些功能而受雇,并且合同上有义务在这个区域工作一段时间。
这种模式非常低效。我认识一位天体物理学博士生,他花了一年多时间尝试在现有的n体代码中实现一个相对基本的数学,只有几百行代码。为什么需要这么长时间?因为她花了几周时间试图理解现有的,可怕的编写代码,以及如何将其计算添加到其中,以及 个月 由于单一的代码结构,加上她自己缺乏经验,更无效地调试她的问题。请注意,几乎没有 科学 参与这个过程;只是浪费时间来处理代码。谁最终支付了这个价格?只有她。她是那个不得不花费更多时间来尝试获得足够成绩以获得博士学位的人。她的主管将在她离开后获得另一名研究生 - 所以这个循环仍在继续。
我要说的是,学术界的软件创建过程中的问题在系统本身内是流行的,是可用资源和奖励工作类型的函数。这种文化深深植根于学术界。我没有看到通过外部资源或培训改变这种文化的任何简单方法。这是系统本身需要改变,奖励人们编写实质性代码,对使用科学代码产生的结果的正确性进行更严格的审查,认识到培训和流程在代码中的重要性,并让监督者共同负责浪费他们研究小组成员的时间。
没有更多的东西可以添加到已经说过的内容中。这是一个艰难的平衡,因为我们的优先事项是不同的 - 学术界都在发现新事物,软件工程更多的是根据规范完成任务。
我能想到的最重要的事情是尝试从学术界内部的内部发展文化中解脱出来,并试图保持一种纪律严明的发展方法,这在很多情况下可能因时间限制而变得困难,缺乏经验等。这种控制性的事情会影响个人的责任和决策,并将其交给一些不一定最了解的人。
获得一本关于软件开发的好书,已经提到的Code Complete非常出色,以及任何有关算法和数据结构的受人尊敬的书籍。阅读您将如何管理数据,例如,您是否需要快速查找/散列表/二进制树。不要重新发明轮子 - 使用图书馆和STL之类的东西,否则你可能会浪费时间。网上有大量的内容,包括这个非常好的博客。
许多学者,除了有时候对于任何被视为商业化的方法具有主导性和珍贵性之外,在他们的目标中往往相当模糊。说得客气一点。仅仅因为这个原因,建立自己的辅助函数和配方软件库是至关重要的,最终希望最终得到一种灵活的实验框架,使您可以尝试任何组合,而不受任何特定问题的限制。区域。强烈抵制只是潜入手头问题的诱惑。
我做的那种大科学(粒子物理学)有少量大型,长期运行的项目( 根 和 GEANT4 , 例如)。这些主要由实际编程专业人员开发。使用业内其他任何人都认可的流程。
然后,每个合作都有一些项目范围的计划,这些计划是在少数高级编程科学家的指导下协同开发的。这些至少使用基本工具(总是版本控制,通常是某种错误跟踪或自动构建)。
最后几乎每个科学家都在自己的项目上工作。在这些程序中使用过程非常不稳定,并且他们经常遭受其他人讨论的所有弊病(生命周期短,编码技能差,没有评论,许多连续维护者,未发明此类综合症等等)。与小组科学相比,这里可用的唯一优势是它们可以使用我上面谈到的工具,所以你可以指出并说“这就是你想要达到的目标。”。
最困难的部分是“这只是一篇论文”和“我们真的要用它”之间的过渡。
如果您知道代码只适用于纸张,那么可以使用快捷方式。硬编码你能做的一切。如果程序员是唯一一个将运行代码的人,请不要在广泛验证上浪费时间。等等。问题在于有人说“太棒了!现在让我们用它来实现”或“现在让我们使用它来完成与开发和测试的完全不同的场景。”
一个相关的挑战是必须解释为什么软件没有准备好黄金时间,即使它显然有效,即它的原型质量而不是生产质量。你是什么意思需要重写它?
我建议您/他们阅读“清洁代码”
http://www.amazon.co.uk/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/ref=sr_1_1?ie=UTF8&s=books&qid=1251633753&sr=8-1
本书的基本思想是,如果你不保持代码“干净”,最终混乱将阻止你取得任何进展。