jjzjj

那个酷爱写代码的少年后来怎么样了——走近华为云“瑶光少年”

AImatters 2024-06-16 原文

导读:为什么计算机学霸都喜欢写代码?

2019年8月,25岁的童昊入职华为,当时他根本没有想到,两年后自己参与研发的瑶光资源二次调度通用求解器,每年可以为华为云节省数千万元,这也成为他参加工作两年多来最有成就感的事。

不久前,笔者电话采访了童昊,作为华为云一名年轻的研发工程师,童昊低调沉稳,言语间透着浓浓的理工科学霸气质,说起代码就展现出健谈的一面。

外界赋予了他 “瑶光少年”的称号,童昊却认为自己没有任何光环,他说,自己就是华为云千千万万年轻的开发者之一,对代码的热爱一如既往,随时准备迎接下一个挑战。

天生爱挑战,婉拒谷歌的小城学霸

“一片树林里分出两条路,

而我选了人迹更少的一条,

因此走出了这迥异的旅途。”

正如美国诗人罗伯特·弗罗斯特那首著名的《未选择的路》,“别人家的孩子”童昊在相同经历的同龄人中选择了少数人走的路。

童昊出生在一个普通的小城市,小时候和普通男孩一样,喜欢玩电脑游戏。小学一次偶然的机会,一个计算机兴趣班开启了他对计算机的浓厚兴趣。当时,中国的互联网浪潮在短暂的繁荣后经历了泡沫破裂,在信息相对闭塞的小城,计算机兴趣班和竞赛在很多人看来会影响学习,有点不务正业。童昊是幸运的,在家庭的支持下,从小学到中学,不断活跃在各类计算机竞赛中。这种对计算机、编程的痴迷,在大学时得到了充分释放。

如愿考上四川某知名理工类“双一流”院校后,从本科到研究生毕业的7年里,童昊除了专精学业,其他大部分时间都泡在一个又一个国际计算机竞赛中,为了备战竞赛,有时整个暑假都不回家。

这种对竞赛、对挑战的喜爱,让童昊成为学校ACM集训队拿竞赛金牌数量最多的学霸。他曾获ICPC(ACM国际大学生程序设计竞赛)亚洲区冠军、世界总决赛第13名;IEEEXtreme编程挑战赛世界第2名;DIMACS 12th Implementation Challenge冠军;并三次参加华为软件精英挑战赛总决赛,获季军。

作为一名计算机领域的顶尖学生,研究生毕业那年,童昊接到了谷歌等不少顶尖科技公司的offer。经过一段时间的思考,他婉拒了谷歌,选择了华为。

“可能是个人偏好,我本身就喜欢去做一些有挑战性的、更有难度的,或者更具不确定性的事情,包括之前参加竞赛就是这样。另外,近几年华为不断加大力度招聘顶尖人才,感觉自己在华为能够得到更多的成长机会,更能发挥出自己的优势和能力。”

就这样,童昊的个人选择与国内科技产业自主创新的大时代,以及华为大力投入人才培养的多种机遇相重合,迅速完成了从学霸到技术骨干的蜕变。

优化“俄罗斯方块的窟窿”,竟然价值数千万元

加入华为云,童昊参与的第一个项目与运筹优化有关,主要研发瑶光资源二次调度通用求解器。它要解决的核心问题是,如何智能整理云数据中心的物理资源碎片,提升数据中心的资源利用率,其核心技术之一 —— 智能调度和运筹优化,是童昊主攻的方向。

云服务商交付给客户的资源中,其中一大部分是虚拟机的资源,云主机的部署其实就是把虚拟机向物理机分配的过程。客户按需购买云上资源,会导致云上业务负载时刻被大批量地创建,又大批量地释放,导致资源池中的物理主机会随时产生一些资源碎片,无法被有效利用。

童昊将这一过程形象地比作“俄罗斯方块”游戏。“当不同形状的方块不断地累积又不断消除时,中间势必就会出现一些窟窿。这些窟窿对数据中心来讲,其实是被浪费的资源。尤其在业务体量很大的时候,对于数据中心的运营成本是很大的负担。”

而童昊所做的瑶光资源二次调度通用求解器就是填上这些“窟窿”。

听起来很简单,但具体实现起来,复杂度和多变性导致童昊和同事们面临的约束条件非常多,要实现的目标也非常多维度。这与之前参加的竞赛相比,挑战和难度都提升了几个量级。

“一方面,我们要去追求极致的效果,要考虑很多不确定性的输入。当一个约束目标变了,之前很多精心设计的算法可能就不再可行了。另一方面,又要保证算法具有非常强的拓展性,去适配业务未来发展的需求。”

童昊和同事们遭遇了前所未有的挑战,“之前,有一版算法马上就要上线了,突然又收到一些新的输入目标,类似这样的波折还有很多。”最终,童昊和团队跳出了传统的思维模式,创新性地做了一个针对二次调度问题的通用性的求解优化框架。

通过将底层算法与业务约束和目标解耦,再通过一个中间层模型关联起来,使求解器具备了一定的通用性。这样,不需要改变底层算法,用户就可以自定义自己的优化目标和优化约束。随后,瑶光求解器的创新在复杂的生产环境中得到了验证,其在华为云数据中心投入使用后,帮助华为云每年节省运营成本达数千万元。

“通过瑶光的项目,为公司实实在在地创造了经济上的价值,对我来讲是蛮有成就感的。”

瑶光项目之后,童昊又找到了新的挑战,也是云计算的另一个核心领域:云上身份认证和访问控制。虽然是全新的领域,但在团队中,童昊属于能力范围较广、算法能力较强的同学,在前辈和同事的帮助下,他很快就进入状态。

“数据安全是客户上云最关心的一个问题,我们希望提供更多属性和类型的访问控制的能力,去加强用户的数据安全性。”

follow your heart,写代码是很快乐的事

马斯克曾经在一次演讲中表示,自己成功的关键是“内驱力”,他表示,“令人忧虑的是今天孩子学习和进步的动力几乎全部来自外在压力和奖励。结果是他们既不会有宏伟的目标,也不会有坚忍不拔的毅力。”

在华为云的短短两年多时间,从学霸到技术骨干,童昊不但迅速融入新环境,完成一个又一个挑战,自身也获得了加速成长。那么,是什么成就了今天的童昊?

童昊说,自己刚出校园不久,还有太多东西需要学习,如果非要说有什么经验分享,有两点:始终坚持兴趣和对自己精益求精的高要求。

“我能分享的最大经验就是follow your heart。如果你学习一件事情能让你感觉到快乐或者有吸引力,这就是正确的,可以一直走下去的一个方向。计算机也是这样,你是不是能够在接触计算机,或解决一些问题的过程中,不断感觉到正反馈,感觉到成就感,能够从中去收获快乐。”

童昊认为,自己对代码的兴趣,底层是对思维挑战的热爱。闲暇时间,除了打羽毛球、玩游戏等爱好,思考难题也是一大乐事。“大家一起去思考、讨论一个有意思的数学题,这本身对我是一件很快乐的事情。”

除了坚持热爱,童昊还有一个典型的特质:对自己的高要求。“有人认为,做一件事情,只要它能Work,能满足最基本的需求就好了。这是我不能满足的。我更想去探索,去思考目前业界关于某个项目的最佳实践是什么样的,接着不断地去挖掘,并期望以最高的标准把它做完。”

其实,这种不断精进的内驱力、“今日之我已非昨日之我”的精神,也是华为云工程师共同的特点。童昊表示,“在华为,在我所处的团队里面,身边一直都有很多非常厉害的人。他们对自己所从事的领域,始终持续保持敬畏和热爱,不管自己已经取得了什么样的成就。很多人已经是非常资深的专家,但依然保持非常谦虚的心态和持续学习的强大动力,很让人钦佩,我也希望成为这样的人。”

写在最后

谈到自己的发展规划,童昊非常清晰:坚持云计算领域的技术路线,在广泛了解云计算相关技术的基础上,聚焦智能调度和运筹优化、安全控制两大方向。

“这两块是业务上大的方向和目标,但具体拆分下来,底下有非常多探索性的领域,甚至可以去做业界都没有尝试过的事情。具体想去挑战什么样的问题,华为云和团队还是给了我比较大的选择自由。”

少年强则国强,科技兴则国兴。

瑶光是北斗第七星,自古就可用来判断四季更迭、引向定时。

2021年,华为研发投入1427亿元,在“全球科技企业研发投入榜单”排名第二;华为从事研究与开发的人员约10.7万名,约占公司总人数的54.8%。一大批童昊这样的年轻开发者,就是支撑华为长期发展与科技创新的“瑶光”。每一天,童昊都在和华为其他10万开发者一起,用代码不断谱写属于这个时代开发者的人生故事。

END

本文为「智能进化论」原创作品。

(文中图片来自摄图网)

有关那个酷爱写代码的少年后来怎么样了——走近华为云“瑶光少年”的更多相关文章

  1. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  2. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  3. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  4. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  5. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  6. ruby - Ruby 中的隐式返回值是怎么回事? - 2

    所以我开始关注ruby​​,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出

  7. ruby - 怎么来的(a_method || :other) returns :other only when assigning to a var called a_method? - 2

    给定以下方法:defsome_method:valueend以下语句按我的预期工作:some_method||:other#=>:valuex=some_method||:other#=>:value但是下面语句的行为让我感到困惑:some_method=some_method||:other#=>:other它按预期创建了一个名为some_method的局部变量,随后对some_method的调用返回该局部变量的值。但为什么它分配:other而不是:value呢?我知道这可能不是一件明智的事情,并且可以看出它可能有多么模棱两可,但我认为应该在考虑作业之前评估作业的右侧...我已经在R

  8. ruby-on-rails - 我该怎么办 :remote location validation with CarrierWave? - 2

    我在我的Rails3示例应用程序上使用CarrierWave。我想验证远程位置上传,因此当用户提交无效URL(空白或非图像)时,我不会收到标准错误异常:CarrierWave::DownloadErrorinImageController#createtryingtodownloadafilewhichisnotservedoverHTTP这是我的模型:classPaintingtrue,:length=>{:minimum=>5,:maximum=>100}validates:image,:presence=>trueend这是我的Controller:classPaintingsC

  9. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  10. 程序员如何提高代码能力? - 2

    前言作为一名程序员,自己的本质工作就是做程序开发,那么程序开发的时候最直接的体现就是代码,检验一个程序员技术水平的一个核心环节就是开发时候的代码能力。众所周知,程序开发的水平提升是一个循序渐进的过程,每一位程序员都是从“菜鸟”变成“大神”的,所以程序员在程序开发过程中的代码能力也是根据平时开发中的业务实践来积累和提升的。提高代码能力核心要素程序员要想提高自身代码能力,尤其是新晋程序员的代码能力有很大的提升空间的时候,需要针对性的去提高自己的代码能力。提高代码能力其实有几个比较关键的点,只要把握住这些方面,就能很好的、快速的提高自己的一部分代码能力。1、多去阅读开源项目,如有机会可以亲自参与开源

随机推荐