00后的AI开发者进阶之道:从入门到鏖战MIT编程大赛 | 人物志

「2019 Python开发者日」,购票请扫码咨询 ↑↑↑
作者 | 若名
出品 | AI科技大本营(ID:rgznai100)
当所有中国的高中生都在拼命为跨过高考这道窄门疲惫不堪时,美国的准高中毕业生们也开始申请大学,北京某国际学校的陶子进是其中一员,他的眼神中似乎看不出慌张感。
今年 18 岁的陶子进出生在美国芝加哥,11 岁的时候由于父亲工作的原因随全家回到北京生活。
回国后,在国际学校就读的他仍然成长在美国教育体系下,与国内的同龄人被淹没在繁重的学业压力下相比,陶子进在学习之余还坚持拉小提琴、下棋、击剑,成绩都还不错。
近两年他还喜欢上了编程,当国内的大部分同龄人还在死磕数学题时,他已经做了十几个编程小项目,除了兴趣使然,当然也受到了家庭影响。其父亲是一位连续创业者——涛思数据 CEO 陶建辉。说起陶子进学编程的经历,陶父认为主要是美国教育体系下成长的学生知识面很广,而国内的高中生除了准备高考的课程内容,没有时间和精力考虑太多。
随着对编程语言了解的更加深入,陶子进开始通过参赛来检验自己的编程水平。
在今年 2 月初结束的由大学生和高中生组队参加的MIT Battlecode 比赛上,600多个参赛队伍中,陶子进和四人团队在全球所有参赛队伍中拿到第 9 名,高中生团队中排名高居第 4。
(左一为陶子进,右边依次为队友 Alex、Drason,Tom 连线参加颁奖)
Battlecode 是一款即时策略游戏,参赛者通过两两对战决出胜负。每年的比赛目标任务都会有变化,今年双方需要编写 AI player,通过管理机器人资源并执行不同的攻击策略来摧毁对方的城堡。参赛者将需要学习使用 AI, pathfinding 插件,分布式算法和网络通信技术以使自己的 AI player 尽可能具有竞争力。 整个比赛历时一个月,前十六强在麻省理工学院进行比赛,奖金总额超过 50000 美元。它目前已成为发掘优秀程序员的选拔赛。
这是陶子进第二次参加 Battlecode 大赛,他称这是 MIT 最硬核的 AI 编程比赛,因为特别难做,经常要写程序到半夜,才有机会进入前 16 ,他们整个团队在最后一个星期的比赛中,有好几次到了凌晨 4 点还在编程。
对编程的激情离不开陶子开始学编程时做的小项目,积累更多经验后,才能在大赛中施展拳脚。就此,AI科技大本营与陶子进就参与 Battlecode 的过程和感受,高中生入门学编程的经验进行了交流,其背后也呈现出美国教育体系下学生成长路径的一个切面。
不可否认,纵然家庭环境对陶子进的成长非常关键,而成长在中国教育体系下的大部分高中生没有多少可比性,因为大多数人都没有其他选择。即便如此,至少在编程学习方法和路径上,陶子进的个人学习经验对国内高中生甚至大学生来说是具体、可执行的操作建议。也不止于编程,从他身上,你更应该看到那种超越国内大部分同龄人都还未拥有的广阔眼界和认知。
再战 Battlecode
AI科技大本营:为什么还要再次去挑战 Battlecode 比赛?
陶子进:去年打完以后就去看其他人写的 code,看到各种各样的比赛方法,学习后感觉今年有更好的改变,再加上今年我用的编程语言是 JavaScript,写得更快。另外,我近期也参加了华尔街对冲基金 TwoSigma 的 Halite AI 比赛,全球共有来自 100 多个国家的 4000 多个队伍参加, 我最终排位第 66,属于击败 Benchmark 的前 94 个队之一。在参赛的全球 500 多高中生中,排名第 5,在中国区参赛队中排名第 2。它比 Battlecode 比赛更简单,但是拿第一必须得用好多其他方法,我也积累了一些比赛经验。
AI科技大本营:比赛中主要使用了哪种编程语言?
陶子进:这是第二次参赛,团队的其他三个成员都是我同学。去年第一次参赛的成绩不太理想,当时总排名是前 32,在国际的选手中是前 16。我们第一年用的语言是 Java,今年用的是 Javascript,其他比赛队伍有使用 Java 的,Python 也是有的,但 JavaScript 其实更快。
AI科技大本营:你们在比赛中是如何编写算法来制定战略?取胜的关键点是什么?
陶子进:你要编写一种能够在引擎上运行的算法,然后结合比赛中的地图和已经给出的数据,来给出最好的策略,比如写的某个策略是你用来控制整张地图的,如果你获得更多的机器人资源,你就会比竞争对手更好,但如果你写的程序超过 20 毫秒都没有响应,那可能就会输掉比赛。比赛的第一周基本都是写 Foundation,这样后面写的策略都可以加进去,
每个队伍都有自己的策略,然后你要看他们的用的是哪种策略,因为这种比赛可能有 A、B 和 C 三种策略,你得先选一个好的,然后再看你对方在做什么,完了再改你自己的,但由于比赛时间有限,有些策略是没时间去做的,所以你要全局考虑进行应对。
AI科技大本营:拿到这么高的名次,你们团队还有哪些做得比较好的地方?
陶子进:我们经常会看别人以前的比赛,仔细研究为什么输了或者赢了,这会提醒我们在比赛中要做出改变,比如最后一次比赛中就用了观察到的新策略让我们进入了前 16。其次是我们写程序算是比较快的,比如要对 DFS(深度优先算法)很熟悉,马上能在几十秒内就写完,所以加新的策略很容易,没有花那么多时间在 Foundation 框架上。
AI科技大本营:比赛过程中遇到比较困难的地方有哪些?当时是怎么解决的?
陶子进:困难的就是 debug,因为这次比赛中没有明显给我们提示程序哪个地方出了错,所以还是耗了好多时间找到问题来解决。
AI科技大本营:比赛最刺激的经历是什么?
陶子进:赛程是 22 天,特别短。有意思的是你必须要选做什么,没有足够的时间找到最优解,必须得选要写 A 还是写 B,做数学计算,估计它的重要性。当然,最后我们团队拿到了第九名,主办方给了我们 1750 美元奖金。
AI科技大本营:团队止步第九名,哪里出现了失误?
陶子进:每一场比赛里面都是随机地图,你得做出很好的判断去适应这些地图,第二句和第三局(双淘汰机制)我们都没有做好。赢了我们的那个团队,其实平常我们是打败他们的,只是这一次他们有一点小幸运。
编程入门之道
AI科技大本营:你是从什么时候对编程感兴趣的?
陶子进:六年级的时候接触过编程,但当时并没有产生兴趣,真正开始学编程是在高中十年级的时候,最近两年,做的项目也更多了,对编程产生了更大兴趣。去年开始写程序的时候,是从 JavaScript 和 CSS 开始写的,逐渐开始对编程感兴趣,通过 JavaScript 还学了 Processing.js, Node.js。
AI科技大本营:主要通过哪些途径学习编程?
陶子进:主要是看网上的资源,一些在大学里开始学计算机的朋友给我推荐了一些网站,对我帮助挺大的。另外我自己有几本 CS 书和 Script 类的书,这两者还是有关系的。
AI科技大本营:有哪些可以推荐的学习网站?
陶子进:美国的 edX 课程(注:edX 是麻省理工和哈佛大学于 2012 年 4 月创建的大规模开放在线课堂平台),还有 freecodecamp, Github 和 MDN Web Docs 网站,比如我要做软件的话,就会从 Github 上找到我需要的库,我最基础的编程能力都是从这些网站学来的,不会的东西都是靠维基百科现搜。
AI科技大本营:除了参加编程比赛,你都做过哪些项目?
陶子进:现在大概做了十几个项目。去年 10 月,我和另一个人帮北京一所小学写了一个读英文书 ese 学习平台,帮助小学生学英语,平常记录他们读书的时间,通过这个平台可以检测学生是真的读,还是在玩游戏。
还有一个圣诞节做的“teachers appreciate week”的小程序,通过扫二维码,把祝福和感谢的话发送到大屏上,然后显示出来,后台统计有超过 400 人扫码。
很多小项目都是通过我自己在微信跟人聊,觉得好玩的才去写的。一个比较大的项目是 Polytomizator,这是一个 web 小程序,当你上传照片到这个网站上的时候,它可以几秒钟生成 Poly 艺术照,但如果你要用 Photoshop 处理照片的话,可能需要很长时间。它主要是用 JS 和 HTML 来做的。
还有一个是让人玩的 Cut-Bread 的小程序,它可以均匀切割面包、水果等事物,比如图片上有两个面包一个火腿,可以让你一刀切下去保证一半是火腿,一半是面包,我也不知道为什么,但这个小游戏已经有数千人玩过了。
更多项目可查看 GitHub 网站:
https://stonet2000.github.io/projects.html
AI科技大本营:让你不断去做这些项目的动力是什么?
陶子进:做这些项目很有成就感,因为都是很容易可视化的成果,这其实是比较好的。但如果一开始不是直接写程序,而是学离散数学这些理论知识,我觉得自己不会对编程产生兴趣,但我知道那些东西是需要学的。
AI科技大本营:这应该跟美国教育的风格相关。
陶子进:是,我有个老师之前教了一些基本的编程原则,教得很好,而且美国人的教法特别注重你自己要做点什么东西。
AI科技大本营:你爸妈都会编程,家庭环境的影响也是一部分?
陶子进:会有影响,会讲一些基本概念,但并没有具体辅导。
AI科技大本营:马上要读大学了,申请了哪些学校?准备读什么专业?
陶子进:申请了 MIT 等 10 所大学。因为我现在做了这么多 CS 项目,现在主要想学的是 CS,但也不一定说大学还想去做,我也不是特别知道我想干嘛,所以我特别想去美国,因为美国学校可以让你(自由)选择。
(本文为 AI大本营原创文章,转载请微信联系 1092722531)
◆
精彩推荐
◆
「2019 Python开发者日」演讲议题全揭晓!这一次我们依然“只讲技术,拒绝空谈”10余位一线Python技术专家共同打造一场硬核技术大会。更有深度培训实操环节,为开发者们带来更多深度实战机会。更多详细信息请咨询13581782348(微信同号)。
推荐阅读:
技术头条
收藏指数爆表!CVPR 2018-2019几十篇优质论文解读大礼包! | 技术头条
分析11年21部漫威电影,一览导演、主演、口碑票房最佳......
靠找Bug赚了6,700,000元!他凭什么?
30位90后霸榜! 福布斯: 比你年轻、比你有颜、比你有才华, 就是他们了!
程序员深夜逆行被拦后崩溃欲自杀:老板在催我!女朋友在催我!
微软 CTO 韦青:“程序员 35 岁就被淘汰”是个伪概念 | 人物志
OpenStack已死?恐怕你想多了 | 技术头条
❤点击“阅读原文”,查看历史精彩文章。
相关文章:

js的全部替换函数replaceAll
JS替换功能函数,用正则表达式解决,js的全部替换,学习js的朋友可以参考下。 alert("abacacf".replace(a,9)); alert("abacacf".replace(/a/g,9)); 第一个运行的结果 9bacaf 这个只是替换了第一个 第二个运行的结果 9b9c9f…
【C++】Google Protocol Buffer(protobuf)详解(一)
1、简介 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准, Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通…

python使用difflib对比文件示例
使用difflib模块对比文件内容1 示例:字符串差异对比 vim duibi.py#!/usr/bin/env python # -*- coding: utf-8 -*- import re import os import difflib tex1"""tex1: this is a test for difflib ,just try to get difference of the log 现在试试…

技术大佬们都推荐的vim学习指南来了,值得收藏!
「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑作者 | kbsc13,京东算法工程师,研究领域计算机视觉来源 | 机器学习与计算机视觉(ID:AI_Developer)编辑 | Jane【导语】在 Linux 下最常使用的文本编辑…

NoSQl分类
2019独角兽企业重金招聘Python工程师标准>>> http://nosql-database.org/ nosql简单分类 类型 部分代表 特点 列存储 hbase cassandra hypertable 顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩&…

手撕代码之七大常用排序算法 | 附完整代码
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑0.导语本节为手撕代码系列之第一弹,主要来手撕排序算法,主要包括以下几大排序算法:直接插入排序冒泡排序选择排序快速排序希尔排序堆排序归并排序…

【C++】google gtest 详解
1、参考博客; https://blog.csdn.net/baijiwei/article/details/81265491 https://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 2、编译和安装 $ git clone https://github.com/google/googletest.git $ cd googletest $ mkdir mybuild $ cd mybui…

JS学习笔记之call、apply的用法
1、call和apply的区别 call和apply唯一的区别是传入参数的形式不同。 apply接受两个参数,第一个参数指定了函数体内this对象的指向,第二个参数为一个带下标的集合,可以是数组,也可以是类数组,apply方法会把集合中的元素…

实验LVS+keepalived
lvs说明:目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR);八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)。在调度器的实现技术中,IP负载均衡技术是效率最高的。在已有的IP负载均衡技术中有通过网络地址转…

Spark Streaming笔记整理(二):案例、SSC、数据源与自定义Receiver
[TOC] 实时WordCount案例 主要是监听网络端口中的数据,并实时进行wc的计算。 Java版 测试代码如下: package cn.xpleaf.bigdata.spark.java.streaming.p1;import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.spark.Spar…

复旦邱锡鹏教授公布《神经网络与深度学习》,中文免费下载 | 极客头条
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」,购票请扫码咨询 ↑↑↑整理 | Jane出品 | AI科技大本营优质的人工智能学习资源一直是大家非常关注的,以往我们也推荐过很多优秀的课程、书籍等,不过大多来自国外的名校、名师,…

【Qt】信号和槽传递自定义结构体
一、使用信号和槽传递自定义结构体 这是一个老问题了,但是每次使用都要bing,因此做个笔记整理下。 一共有三种方法,可以让结构体在信号和槽之间传递。前两种方法可以让结构体在线程之间传递,最后一种方法只能在同一线程中传递。 Q_DECLARE_METATYPE qRegisterMetaType(推…

Tomcat:Connection reset by peer: socket write error
Connection reset by peer: socket write error错误分析及解决 Connection reset by peer: socket write error错误分析: 常出现的Connection reset by peer: 原因可能是多方面的,不过更常见的原因是: ①:服务器的并发连接数超过…

人脸识别的“生意经”
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」,购票请扫码咨询 ↑↑↑作者 | Jeff John Roberts译者 | 孙薇责编 | 琥珀出品 | AI科技大本营(ID:rgznai100)导语:不经意间,科技公司便拿着你的照片,推…

【Qt】pro中使用DEFINES来实现条件编译
1、pro中使用DEFINES来实现条件编译 在Qt的pro文件中使用DEFINES 来实现类似gcc -D的条件编译功能。 如,在pro中: #定义条件编译宏LAOER DEFINES += LAOER #依赖编译宏LAOER的编译选项: contains(DEFINES, LAOER){message(hello Laoer) } #与编译宏LAOER冲突的编译选项: …

nodejs -- promise的返回
为什么80%的码农都做不了架构师?>>> [javascript] view plain copy const a async () > { return Sequelize.findAll({}) //这里返回一个promise,"aaaaa"也行 } const b async ()>{ const result await a…

SQL 将一列数据转为一行字符串[转]
比如:我用select department,userName from users从表中查询出如下数据department | userName--------------- --------------it it1it it2it it3ur ur1ur ur2我能不能用什么SQL对department进行分组然后变成如下的结果呢?department | userName--------…

【C++】C++11的enum class enum struct和enum
1、问题描述 在走读QtCreator中看到一段代码 在QtCreator-v4.9.2源码中 src\plugins\projectexplorer\projectnodes.h enum class NodeType : quint16 {File 1,Folder,VirtualFolder,Project };以前一直使用enum,这里使用的是enum class,新enum的好处…

浙大首届AI专业本科生将于9月入学,纳入竺院图灵班
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」,购票请扫码咨询 ↑↑↑整理 | 琥珀出品 | AI科技大本营(ID:rgznai100)近日,据澎湃新闻报道,浙江大学计算机科学与技术学院副院长、浙江大学人工智能研究所所长吴飞…
解决阿里云无法正常使用samba的问题【转】
转自:https://blog.csdn.net/u011949148/article/details/54311288 昨天在阿里云上申请了一个云服务器,系统用的是ubuntu14.04,由于是免费的(初次使用),配置较低(单核1G内存,40G硬盘…

Google又放大招:高效实时实现视频目标检测 | 技术头条
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」,购票请扫码咨询 ↑↑↑作者 | 陈泰红,算法工程师,研究方向为机器学习、图像处理来源 | 极市平台(ID:extrememart)图像目标检测是图像处理领域的基础。…

一个java删除文件夹的小方法
java删除文件夹都是从里向外删除,使用递归的方法。public class IO_FILEdemo09 {public static void main(String[] args) {// TODO Auto-generated method stub// 删除目录演示File dir new File("C:\\version1");DeleteAll(dir);}public static void D…

【C++】operator bool() 和 operator const bool() const
1、问题描述 在走读QtCreator源码时,看到如下运算符重载 源码在QtCreator-v4.9.2中 src\plugins\projectexplorer\projectexplorer.h class OpenProjectResult { public:OpenProjectResult(const QList<Project *> &projects, const QList<Project *…

tomcat高并发的配置
以下内容来源于互联网,具体出处不详 据说服务器运行TOMCATJDK环境能负载到动态1W的并发,贴上他的配置,以后有机会在测试! java 环境配置: export JAVA_OPTS"-server -Xms8g -Xmx8g -Xss128k -XX:ParallelGCThread…

【AI】图示:精确度(查准率)Precision、召回率(查全率)Recall
对Precision、Recall的直译是“精确度”和“召回率”,第一次接触这两个词,很难从字面上知道它们的含义。而翻译成“查准率”和“查全率”就比较好理解,下面统一使用“查准率”和“查全率”。 1、真假正负例 真正例(True Positive…

@程序员,如何“终身成长”与跨界?
文 / Ant说《终身成长》是一碗“鸡汤”并不为过,截止到我看过的前半部分,围绕在一个主题展开——人的潜力是不可知的。换句话说,任何人都有可能成为自己想成为的人。书中列举了大量明星企业与管理者的真实案例,也引用了许多对比实…

TCP通过滑动窗口和拥塞窗口实现限流,能抵御ddos攻击吗
tcp可以通过滑动窗口和拥塞算法实现流量控制,限制上行和下行的流量,但是却不能抵御ddos攻击。 限流只是限制访问流量的大小,是无法区分正常流量和异常攻击流量的。 限流可以控制本软件或者应用的流量大小,从而减少对部署在相同物理…

WPF及Silverlight中将DataGrid数据导出
这段源码是我在项目中实际应用的源码,没有经过删减及处理。 如果你认为有用可以摘去作为自己的导出类中的一个小工具使用。 ///<summary>///数据源导出辅助类 ///</summary>///<remarks>///Author: sucsy ///Create date: 2011-…

首发 | 驭势科技推出“东风网络”:如何找到速度-精度的最优解?| 技术头条...
点击上方↑↑↑蓝字关注我们~「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑作者 | 驭势科技给定目标硬件,如何确定最优的速度-精度折衷边界?换言之:给定推断延时的限制,模型能达到的最高精度是多少?…

【AI】caffe使用步骤(一):将标注数据生成lmdb或leveldb
1、简述 caffe使用工具 convert_imageset 将标注数据转换成lmdb或leveldb格式,convert_imageset 使用方法可以参考脚本examples/imagenet/create_imagenet.sh。 convert_imageset 在./build/tools/中。 2、convert_imageset命令行参数 ./build/tools/convert_ima…