百科问答小站 logo
百科问答小站 font logo



科学计算的程序编写和通常所说的码农的编程有多大的区别? 第1页

  

user avatar   benderbrodriguez 网友的相关建议: 
      
  • 90%的时间用C/C++、Fortran。偶尔用mathematica, matlab等高级工具干些零碎的活;
  • 最重要的是正确性,其次是速度;
  • 99%的时间花在除虫上,其中90%的情况是数组指标越界;
  • 大量使用各种数值算法和线性算法,很少使用基于复杂数据结构的算法;
  • 程序快不快,全看会不会迭代;程序好不好,全凭文章在哪找;
  • 程序里设置很多参数,取值都是试出来的,一般不能改动;
  • 先写串行程序,再写并行程序;
  • 经常访问数学维基或百科网站(wikipedia、mathworld、planetmath等);
  • 科学计算领域的圣经是Abramowitz和 Stegun的数学手册,谭浩强是Numerical Recipe;
  • 代码的长度随着科研项目的进展不断增长;
  • 大量使用组里“祖传”下来的程序,被告知不要改变里面的参数;
  • 使用双精度;
  • 依赖编译器的优化,对硬件构架也有些了解;
  • 被告知尽量不要使用闭源软件;
  • 属于VIM或Emacs阵营之一;
  • hostname 是个科学家的名字;
  • 有几个从师兄师姐那儿拷来的脚本;
  • 程序的文档就是正在写的文章;
  • 梦想再装块显示器;
  • 有作为人形高级计算器的觉悟;
  • 梦想着有一天写个巨牛逼的脚本把程序从编译到执行到数据处理都自动化了;
  • 程序能跑的时候项目才完成了5%~10%;
  • 用并行(parallelism)不用并发(concurrency),用数组不用链表;
  • 变量名字起的很怪,其实是从方程里来的;
  • 程序不具有可读性,除非你先读懂对应的文章;
  • 不断有新入组的学弟学妹抗议代码不符合软件工程,后来他们要么闭上嘴去灌水,要么拿了master走人了;
  • 常常有重构代码的欲望,试过几次都放弃了,终于有天下午把代码重构了一遍,结果发现跑出来的数据怎么都不对,从此彻底放弃;
  • 总以为做科学计算的人写的代码都很丑,后来看过一个大牛写的代码,彻底惊呆了 —— 但学CS的室友照样说丑;
  • 写着写着,一不小心代码就成了某个领域某个小方向 the state of the art;
  • 常常提醒自己是科学家不是程序员。

  • 程序员总是认为HPC的编程很弱智,真让他/她们去写HPC代码 ——开玩笑——他/她们连流体力学(量子化学、广义相对论 …… )都不懂,怎么可能会做科学计算;

  • 找到工作的时候鄙视程序工程师的职位,找不到工作的时候哭着喊着要当程序员;
  • 是程序员里面最懂流体力学的,是懂流体力学的人里面最能发文章的,是能发文章的人里面最会写程序的;
  • 是宅男里面最费电的,是宅女里面最费纸的。


user avatar   francium-bobo 网友的相关建议: 
      
  • 一切以物理研究维准绳, 你能提出一个新公式, 甚好; 能在计算中发现新现象, 不错; 把程序用面向对象重写一遍--你这里有什么新物理么? 我招你进来又不是让你干这个的!
  • 如果你能提出一些新设想或者新观点, 老板会两眼放光; 如果想把程序的某一部分写的简单易懂一点, 老板表面上还是欢迎态度, 心想这货又在偷懒, 反正我又不会放到master branch里面。
  • 虽然正确性绝对是第一位,速度和优化还是非常要紧的, 某超算中心给我们分了每年五千万小时*核心的计算资源, 大概50人一起烧, 有个家伙第一个月就用掉两百万小时*核心, 然后老板开会跟我们说你们特么省点用, 想好了再算!而性能上的每一点优化, 省下来的都是真金白银, 你说我们有没有动力去做优化。
  • 然而优化数据结构, 展开循环什么的其实是相对较low的优化方法。 物理界的数学大牛一般都是直接优化算法, 辛流形实分析复分析满天飞, 有的时候可以带来几十倍的性能提升, 几年内发几十篇文章, 然后飘飘然去碾压其他方向。
  • 同学到天河1A去做整机运行, 就是把天河所有的计算能力全用上。 24小时烧掉10万+人民币, 后来发现参数调错了, 计算结果无效。自行脑补老板的表情。

==以下是吐槽==

我们实验室的主要应用程序,从90年代一直开发至今, 原来是GPL授权, 后来变成private的了~~~~
几十个参数设置不佳或者不匹配会出段错误,
会出段错误,
段错误,


实验室的人肉版本控制系统:导师

PS:这个是有典故的, 负责做软件的其他组同学过来参观, 看我们的版本都是用日期命名, 好奇问我们用什么VCS, 我说没有, 老板说我们有版本控制, 手动的

经过多方努力, 我们的程序终于初具面向对象功能了!就是把原来的全局数组+子程序用30几个参数的函数包起来, 每一个参数都是几十万长度的Array(幸好Fortran是传指针)

循环人肉展开, 有的同学不会用循环, 直接写成 x(1) =1 x(2) = 3 x(3)=5, 省的编译器展开循环了。。。。

上古神器goto, 程序里有一个核心部分从1995年以后就没人动过, 原理是一个循环, 中间会有各种条件跳出, 然而并没有用结构化循环, 全尼玛是goto实现的, 后来说要优化这一部分, 果断找浪潮的工程师, 还是为他们捏一把汗。

什么, 你要改一个参数?在源代码里xx行, 找过去是这么写的

       switch=0  if(switch==1) then   balabala else if (switch ==0 ) then   balabala end if      

改完之后重新编译一遍就行了。尼玛不把参数拿到配置文件至少用个宏啊。

上面说到的switch还算是良心之作, 一个师姐写的概念验证程序(大概也有5000+行), 里面的开关选项是这么写的:

       real :: switch = 0.0  if( switch == 0.0 ) then   balabala else if ( switch == 1.0) then   balabala end if      

当时我心中万千草泥马跑过, 心想现在的编译器擦屁股能力还真强, 这都能得出正确结果

就这破程序做出来的结果还上过Science




  

相关话题

  为什么不流行国语编程? 
  为什么大多数程序员不看好图形化编程? 
  要学 Python 需要怎样的基础? 
  作为一名 IT 技术牛人是一种怎样的体验? 
  程序员最大的悲哀是什么? 
  不适合编程的人是怎样的? 
  第三届 Gopher China 大会值得参加吗? 
  中国的程序员数量是否已经饱和或者过剩? 
  回龙观哪里适合买房? 
  有了 IP 地址,为什么还要用 MAC 地址? 

前一个讨论
玻璃是固态和液态的量子叠加,意思是说玻璃是哪种状态是相对的,对吗?
下一个讨论
物理系学生如何提高编程水平?





© 2025-03-29 - tinynew.org. All Rights Reserved.
© 2025-03-29 - tinynew.org. 保留所有权利