Independent Brand

自研品牌

Culture Activity

文化活动

来了解真实的奇舞团—2019小年会

奇舞团小年会(又名奇舞团年度零食会、奇舞团最大型抽奖活动)1月10日在360大厦成功举行。 Three two one go~ 第一趴是各组 leader 述职,乍一听,嗯?这咋跟抽奖没啥关系呢,零食看起来都不香了呢~ 说啥呢,好好好,钱能解决的问题都是好问题。这个环节是可以赚钱的呀,孩子。为什么呢? 有红包呢,这个环节时间是用钱来买的哦,每个人只有5分钟时间述职,他们想跟大家多聊聊,大家有的是时间,现场陪聊可还行?由我们一位可爱的同学负责计时,为了确保大家现场陪聊的工资能按时足量发放,我们成银大大担任我们的公证人,负责帮大家确定红包额度,真是辛苦您了。 “热切希望对React Hooks感兴趣、有了解、研究过、想尝试的小伙伴加入我们组......” 诶诶诶,磊哥你干啥呢,咋还现场挖人呢,磊哥开了头之后,现场招聘广告满天飞,群主都管不住了的那种,360奇舞团内部人才招聘市场它怎么就开始了呢? 咦,这是哪个leader的PPT卡住了呢,是不是没用在线制作PPT的声享(http://ppt.baomitu.com)呀,那要不你先改一下PPT,这个时间我们干点什么呢,不如唱个歌吧,说唱就唱,音响师,灯光师,歌手请就位~ 想不到吧,述职居然可以有现场听,开心心~ 谢谢你! 感谢在这一年里为我们奇舞团基础建设做出突出贡献的兄弟姐妹(的代表)~ 他们是天天跟大家见面的奇舞周刊的白月光(小编)——付某(负责奇舞周刊周五周刊三年半)、陈某某(负责周三日刊一年半)//此处有优秀俩字。 感谢为我们招新同学的最勤劳面试官——怡红公子。 泛前端分享前四名的同学—分别是我们的新同学 Hax、刘某某、郝某某和韩某某(周刊小编)这四位同学(某几位大佬慷慨放弃奖励之后的排名,让我们一起感谢各位大佬[鞠躬~]),恭喜四位同学。新同学Hax多次在泛前端的分享,奇舞团的同学都觉得受益匪浅。 还有为我们辛苦付出很多的我们部门的 hr 小姐姐,感谢您~ 这张照片怎么从左到右、从右到左看都觉得我们奇舞团不太年轻呢!朋友,那是昨天临时组成的颁奖嘉宾奇舞团老年组F4呀小老弟。 咳咳,让我中个奖 它来了它来了,它带着一大堆奖品来了~ 这一大堆奖品我们要怎么发呢,由于前几天在大年会上嘲笑刚开始中了三等奖的我团同学,为了不让这种影响同事间塑料友谊的事情再度发生,我决定在抽奖的时候只让大家拿到奖项,最后统一公布奖项对应奖品,那我准备了哪些奖项呢? 哇,看到这个名字,终于不用在抽奖的时候嘲笑同事中了末等奖了,同事间的塑料友谊可算是保住了,惊吓惊吓! 抽奖程序现场写 奇舞团年会的最后保留节目!!! 大家期待的月影大大现场亲自操刀的抽奖程序环节(历年抽奖代码GitHub地址:https://github.com/75team/raffle)。 月影大大说,今年不用 CPU 抽,用 GPU 抽。对于传统的前端开发者来说,对于可视化,深层的WebGL没有很深入的理解。想要了解更多,那就来奇舞团吧!此处强烈安利开源的跨平台的高性能图形系统SpriteJS ,最近于2019年发布新版本的SpriteJS 3.0(https://spritejs.org/#/)针对可视化大屏渲染优化性能提升10倍以上哦~~~毫无广告痕迹的广告。 一波彩虹屁~ 哇,正在写抽奖程序的月影大大看起来格外帅 //我不管,我吹的彩虹屁必须让领导看到!!! 要是我也可以中奖就更帅呢(dbq,我就是这么现实 。。。。。。。。。。。。。五十多个奖抽完了,总共85个人(这是铺垫 后边的流程我也不想管了,你们想干嘛干嘛吧,我走了,奇舞团容不下我了。 快乐是他们的,我什么都没有 妈妈,就是这些人把奖品都中走了 不让我中奖的代码都不是......... 祝你们开心,不要劝我! 等一下,AirPods pro没人要了吗 咚咚咚...你的小金库可爱的上线~ 成银:我和月影再一人捐个 AirPods pro 吧 内心OS:好,那我不走了。。。没中奖的人不多了,我的机会不就来了吗(哎呀,我准备好了,已经没有什么能阻挡我中奖了,谢谢大家 成银接着说:但是我们要重新开始抽,就是85个人(承上启下,强不强)都有中奖的机会。 开始抽奖~ 咦,这个中奖的名字怎么有点眼熟,这不是我吗,妈耶,真的好善良哦~我的劝说是有用的哎,我拜的财神爷终于想起我了吗??? OMG!!!!! 心诚自然灵♪(^∀^●)♪ 月影写的抽奖代码真棒,写抽奖代码的月影超帅der,捐奖的成银似乎更白了一点,头发多了一点呢~ Happy endding~ 祝大家新年快乐~

Fri Sep 11 2020 07:50:02 GMT+0000 (UTC)

嘿!这真的是一个正经的抽奖程序!

奇舞团有一个传统项目,每年年会由我在现场写一个抽奖程序,所有人一起review代码,以确保抽奖算法正确且公平,然后愉快滴开始抽奖。 现场写的抽奖程序不仅要公平无bug,而且还要有一定的趣味性,且不能和往年的重复。 2017年年会我写了一个随机抽纸牌中奖1的程序,而今年年会,我灵机一动????,决定写一个更有(不)趣(正)味(经)的抽奖程序。 长话短说,我们就着代码一步步往下看。 首先是常规随机洗牌三连: function random(m, n) { return m + Math.floor(Math.random() * n); } function randomItem(arr, from = 0, to = arr.length) { const index = random(from, to); return { index, value: arr[index], }; } function shuffle(arr) { for(let i = arr.length; i > 0; i--) { const {index} = randomItem(arr, 0, i); [arr[index], arr[i - 1]] = [arr[i - 1], arr[index]]; } return arr; }上面的代码没有什么特别的,只是一个朴实的洗牌算法,额外封装两个随机函数,因为后面的代码中还要使用。对比一下,2017年版的代码更加“妖艳”: function* generatePoker() { const points = ['A', 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K']; yield* points.map(p => ['♠️', p]); yield* points.map(p => ['♣️', p]); yield* points.map(p => ['♥️', p]); yield* points.map(p => ['♦️', p]); } const cards = generatePoker(); class PickedCards { constructor(key, storage = localStorage) { this.key = key; this.storage = storage; this.cards = JSON.parse(storage.getItem(key)) || []; this.cardSet = new Set(this.cards.map(card => card.join(''))); } add(card) { this.cards.push(card); this.cardSet.add(card.join('')); this.storage.setItem(this.key, JSON.stringify(this.cards)); } has(card) { return this.cardSet.has(card.join('')); } clear() { this.storage.clear(); } } const pickedCards = new PickedCards('pickedCards'); function* shuffle(cards, pickedCards) { cards = [...cards]; cards = cards.filter(card => !pickedCards.has(card)); let len = cards.length; while(len) { const i = Math.floor(Math.random() * len); pickedCards.add(cards[i]); yield cards[i]; [cards[i], cards[len - 1]] = [cards[len - 1], cards[i]]; len--; } }2017版的随机扑克牌代码 有了上面朴实的随机代码,理论上我们就可以愉快滴抽奖了: function random(m, n) { return m + Math.floor(Math.random() * n); } function randomItem(arr, from = 0, to = arr.length) { const index = random(from, to); return { index, value: arr[index], }; } function shuffle(arr) { for(let i = arr.length; i > 0; i--) { const {index} = randomItem(arr, 0, i); [arr[index], arr[i - 1]] = [arr[i - 1], arr[index]]; } return arr; } let members = ['胖虎', '强夫', '静香', '大雄', '哆啦A梦', '吕布', '张飞', '关羽', '刘备', '曹操', '孙权', '周瑜', '黄盖', '赵云', '吕蒙', '孙悟空', '猪八戒', '唐僧', '沙悟净', '光头强', '熊大', '熊二', '喜洋洋', '美羊羊', '红太狼', '灰太狼', ]; console.log(shuffle(members).slice(-3)); // 抽取3名获奖者 当然,我们不会只是这么无聊滴抽取,还是要玩点花样,不然怎么好意思说自己是前端呢?HTML必须有: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width"> <title>一起抽奖吧</title> <link rel="stylesheet" href="style.css"> </head> <body> <div id="control"><button id="start">开始</button><button id="clear">清空</button></div> <div id="track"> <div><span class="horse"></span><span class="player">1</span></div> <div><span class="horse"></span><span class="player">2</span></div> <div><span class="horse"></span><span class="player">3</span></div> <div><span class="horse"></span><span class="player">4</span></div> <div><span class="horse"></span><span class="player">5</span></div> <div><span class="horse"></span><span class="player">6</span></div> </div> <script src="app.js"></script> </body> </html>CSS简单写一个: html, body { padding: 0; margin: 0; width: 100%; height: 100%; } #control { text-align: center; line-height: 120px; } #control button { font-size: 2rem; margin: 0 10px; } #track { max-width: 1250px; max-height: 500px; border-top: solid 1px #aaa; } #track div { position: relative; height: 100px; line-height: 100px; font-size: 1.5rem; padding: 0 10px; color: #aaa; } #track .player { float: right; } #track .horse { display: inline-block; font-size: 5rem; transform: scale(-1, 1); position: absolute; left: 850px; top: 0; z-index: 99999; } #track .horse span { display: inline-block; transform: scale(-1, 1); } #track div:nth-child(2n) { background: #666; } #track div::after { content: ' '; position: absolute; left: 930px; width: 20px; height: 100%; background: #333; }这个玩法呢,就是个跑马小游戏: 接下来,我们开始完善JS代码。为了记录抽奖结果和连续抽奖(每个人只能中一次奖),避免不小心刷新了页面,导致结果丢失,我们用localStorage存一下: const prizeStorageKey = 'prize10'; function addResults(players) { const result = getResults(); result.push(...players); localStorage.setItem(prizeStorageKey, result.join()); }我们如果不小心刷新了页面,重新开始抽奖之前,我们要把已经中过奖的小伙伴从列表里剔除: function getResults() { const result = localStorage.getItem(prizeStorageKey); return result ? result.split(',') : []; } function filterWinner(members) { const winners = new Set(getResults()); return members.filter(m => !winners.has(m)); } members = filterWinner(members);然后我们可以点【开始】按钮抽奖,点【清除】按钮清除localStorage记录。 const startBtn = document.getElementById('start'); const clearBtn = document.getElementById('clear'); startBtn.addEventListener('click', async () => { startBtn.disabled = 'disabled'; clearBtn.disabled = 'disabled'; // 重新洗牌 shuffle(members); // 取出最后6名同学,倒数3名中奖,剩下3名凑数 const candidates = members.slice(-6).reverse(); // 将中奖结果保存到localStorage中 addResults(candidates.slice(0, 3)); members.length -= 3; // 开始跑马程序 await race(candidates); startBtn.disabled = ''; clearBtn.disabled = ''; }); clearBtn.addEventListener('click', () => { // 清除所有中奖记录 localStorage.removeItem(prizeStorageKey); });接下来就是实现关键的跑马程序了。 其实我们的中奖结果在跑马程序开始前就已经出来了,跑马程序只是运行动画效果,和中奖结果无关。 最简单的一种方式就是根据排名依次从短到长,生成跑马总时间,然后将6个人随机到不同的赛道开始跑马: function race(candidates) { const durations = []; for(let i = 0, duration = 0.9; i < candidates.length; i++) { durations.push(duration); // 每一名次随机增加 0.02 ~ 0.05 的时间 duration += random(2, 5) * 0.01; } const players = shuffle([...candidates.entries()]); ... }但是这样有个问题,就是跑马的时候,名次落后的时间长速度慢,名次靠前的速度快始终跑在前面,胜负毫无悬念,也就失去了赛马的意义。所以要做随机,以保留悬念。 产生随机有很多种方法,这里用一种最简单的方法,就是把一次比赛分成若干个小阶段,每个小阶段分配一个基准时间,但是允许每个选手在该阶段时间有一定的正负扰动。比如: A选手跑完全程时间8秒钟,B选手跑完全程时间为10秒钟,我们第一阶段先取路程的1/4,A跑完1/4程的基准时间是2秒,B是2.5秒,假设扰动参数为正负0.5,那么A跑完1/4程的时间最多是2+0.5=2.5秒,而B跑完1/4程的时间最少是2.5-0.5=2.0秒,这样就有可能在前1/4赛程里A选手反而落后B选手了。多分几个赛程,就可以有足够的悬念。 我们先定义划分赛程的函数: function partRace(durations, factor) { // 根据赛程总时间 duration 和 factor 来划分赛程 // 赛程所用基准时间为 duration * factor,扰动 -0.1 ~ +0.1 const subDuration = durations.map(d => d * factor * random(9, 11) / 10); subDuration.map((d, i) => { durations[i] -= d; return durations[i]; }); return subDuration; }这样我们把全程划分4段赛程: function race(candidates) { const durations = []; for(let i = 0, duration = 0.9; i < candidates.length; i++) { durations.push(duration); // 每一名次随机增加 0.02 ~ 0.05 的时间 duration += random(2, 5) * 0.01; } // 划分4段赛程 const round1 = partRace(durations, 0.25); const round2 = partRace(durations, 0.33); const round3 = partRace(durations, 0.5); const round4 = durations.map(d => d + 0.1); ... }这里面还有一个小技巧,我们划分赛程的时候,给最后一轮留下10%的时间,这是为了避免前面几轮赛程积累的随机扰动使得最后一程的时间太短。 这样我们就可以绘制赛马动画了: function partRace(durations, factor) { // 根据赛程总时间 duration 和 factor 来划分赛程 // 赛程所用基准时间为 duration * factor,扰动 -0.1 ~ +0.1 const subDuration = durations.map(d => d * factor * random(9, 11) / 10); subDuration.map((d, i) => { durations[i] -= d; return durations[i]; }); return subDuration; } function race(candidates) { const durations = []; for(let i = 0, duration = 0.9; i < candidates.length; i++) { durations.push(duration); // 每一名次随机增加 0.02 ~ 0.05 的时间 duration += random(2, 5) * 0.01; } const players = shuffle([...candidates.entries()]); trackEl.innerHTML = players.map((p, i) => { return `<div> <span class="horse">${randomItem(['????', '????', '????', '????']).value}</span> <span class="player">${p[1]} ${i + 1}</span> </div>`; }).join(''); // 划分4段赛程 const round1 = partRace(durations, 0.25); const round2 = partRace(durations, 0.33); const round3 = partRace(durations, 0.5); const round4 = durations.map(d => d + 0.1); const results = ['????', '????', '????', '????', '????', '????']; const T = 8000; const horses = document.querySelectorAll('.horse'); const promises = []; for(let i = 0; i < horses.length; i++) { const horse = horses[i]; const idx = players[i][0]; promises.push(raceHorse(horse, round1[idx] * T) .then(() => { return raceHorse(horse, round2[idx] * T, 30 + trackLen / 4); }) .then(() => { return raceHorse(horse, round3[idx] * T, 30 + 2 * trackLen / 4); }) .then(() => { return raceHorse(horse, round4[idx] * T, 30 + 3 * trackLen / 4); }) .then(() => { horse.innerHTML = `<span>${results[idx]}</span>${horse.innerHTML}`; return raceHorse(horse, 0.1 * T, 30 + trackLen, 100); })); } return Promise.all(promises); }具体的raceHorse就是一个简单的DOM匀速动画绘制过程: function raceHorse(horseEl, duration, from = 30, by = trackLen / 4) { return new Promise((resolve) => { const startTime = Date.now(); requestAnimationFrame(function f() { let p = (Date.now() - startTime) / duration; p = Math.min(p, 1.0); horseEl.style.left = `${from + p * by}px`; if(p < 1.0) requestAnimationFrame(f); else resolve(); }); }); }把完整的代码汇总一下: function random(m, n) { return m + Math.floor(Math.random() * n); } function randomItem(arr, from = 0, to = arr.length) { const index = random(from, to); return { index, value: arr[index], }; } function shuffle(arr) { for(let i = arr.length; i > 0; i--) { const {index} = randomItem(arr, 0, i); [arr[index], arr[i - 1]] = [arr[i - 1], arr[index]]; } return arr; } const prizeStorageKey = 'prize10'; function getResults() { const result = localStorage.getItem(prizeStorageKey); return result ? result.split(',') : []; } function addResults(players) { const result = getResults(); result.push(...players); localStorage.setItem(prizeStorageKey, result.join()); } function filterWinner(members) { const winners = new Set(getResults()); return members.filter(m => !winners.has(m)); } let members = ['胖虎', '强夫', '静香', '大雄', '哆啦A梦', '吕布', '张飞', '关羽', '刘备', '曹操', '孙权', '周瑜', '黄盖', '赵云', '吕蒙', '孙悟空', '猪八戒', '唐僧', '沙悟净', '光头强', '熊大', '熊二', '喜洋洋', '美羊羊', '红太狼', '灰太狼', ]; members = filterWinner(members); const startBtn = document.getElementById('start'); const clearBtn = document.getElementById('clear'); startBtn.addEventListener('click', async () => { startBtn.disabled = 'disabled'; clearBtn.disabled = 'disabled'; // 重新洗牌 shuffle(members); // 取出最后6名同学,倒数3名中奖,剩下3名凑数 const candidates = members.slice(-6).reverse(); // 将中奖结果保存到localStorage中 addResults(candidates.slice(0, 3)); members.length -= 3; // 开始跑马程序 await race(candidates); startBtn.disabled = ''; clearBtn.disabled = ''; }); clearBtn.addEventListener('click', () => { // 清除所有中奖记录 localStorage.removeItem(prizeStorageKey); }); const trackLen = 820; // 205 * 4 const trackEl = document.getElementById('track'); function partRace(durations, factor) { // 根据赛程总时间 duration 和 factor 来划分赛程 // 赛程所用基准时间为 duration * factor,扰动 -0.1 ~ +0.1 const subDuration = durations.map(d => d * factor * random(9, 11) / 10); subDuration.map((d, i) => { durations[i] -= d; return durations[i]; }); return subDuration; } function race(candidates) { const durations = []; for(let i = 0, duration = 0.9; i < candidates.length; i++) { durations.push(duration); // 每一名次随机增加 0.02 ~ 0.05 的时间 duration += random(2, 5) * 0.01; } const players = shuffle([...candidates.entries()]); trackEl.innerHTML = players.map((p, i) => { return `<div> <span class="horse">${randomItem(['????', '????', '????', '????']).value}</span> <span class="player">${p[1]} ${i + 1}</span> </div>`; }).join(''); // 划分4段赛程 const round1 = partRace(durations, 0.25); const round2 = partRace(durations, 0.33); const round3 = partRace(durations, 0.5); const round4 = durations.map(d => d + 0.1); const results = ['????', '????', '????', '????', '????', '????']; const T = 8000; const horses = document.querySelectorAll('.horse'); const promises = []; for(let i = 0; i < horses.length; i++) { const horse = horses[i]; const idx = players[i][0]; promises.push(raceHorse(horse, round1[idx] * T) .then(() => { return raceHorse(horse, round2[idx] * T, 30 + trackLen / 4); }) .then(() => { return raceHorse(horse, round3[idx] * T, 30 + 2 * trackLen / 4); }) .then(() => { return raceHorse(horse, round4[idx] * T, 30 + 3 * trackLen / 4); }) .then(() => { horse.innerHTML = `<span>${results[idx]}</span>${horse.innerHTML}`; return raceHorse(horse, 0.1 * T, 30 + trackLen, 100); })); } return Promise.all(promises); } function raceHorse(horseEl, duration, from = 30, by = trackLen / 4) { return new Promise((resolve) => { const startTime = Date.now(); requestAnimationFrame(function f() { let p = (Date.now() - startTime) / duration; p = Math.min(p, 1.0); horseEl.style.left = `${from + p * by}px`; if(p < 1.0) requestAnimationFrame(f); else resolve(); }); }); }最终的效果: 以上就是今年奇舞团年会的抽奖程序,大家有什么想法可以关注我们的GitHub仓库2与我们交流。 2019年年会的抽奖程序我也已经想好了,只会更加有趣,不过暂时不能透露????,2019年年会继续加油~ 文内链接: https://github.com/75team/raffle/tree/master/2017 https://github.com/75team/raffle

Fri Sep 11 2020 07:50:25 GMT+0000 (UTC)

Technology Activity

技术活动

希望我们都是会哭的孩子更是坚强的大人—360前端星计划

学姐,女朋友嫌我太忙要跟我分手怎么办? 编者按:我是年已过四分之一百赖着不走的拉高奇舞团整体颜值的星计划的小仙女钉子户。 有一天晚自习,星计划某宝宝:学姐,女朋友嫌我太忙要跟我分手怎么办? 我:??? 某宝宝:你男朋友太忙你会跟他分手吗? 我:首先。。。分分分,必须分。 第五届360前端星计划在周五的小组项目汇报和月影大大的走心总结中顺利结束~ 五年,五届星计划,为什么我们要做前端星计划,我觉得最好的回答还是月影大大说的“前端星能够影响更多的学生,不管他们是否最终选择360,总是能让这个行业变得更好,而一个行业变好了,那么作为行业中的每个从业人员,最终都能获益。” 关于课程 今年的星计划课程,我们总结往年的经验,采纳前一届学生的建议,仔细斟酌适合星计划学生学习的难易度,邀请了我司最具前端开发经验的前辈们和有授课经验的讲师们一起开课程确认会讨论出星计划学生需要掌握的知识,更系统的安排了此次星计划的课程。 day1 文博HTML,安佳的CSS和月影JavaScript(1) day2 月影的JavaScript(2),李老师的W3C标准,二哥的命令行和仁义的正则表达式。 day3 李喆明的NodeJS(真香),月影(对,这个人又出现了,我没有写错)的HTTP协议与服务端编程和第一届星计划学员田东东的前端工程化浅析。 day4 智杰的设计模式,赵岩的优化首屏渲染和第二届星计划学员刘冰晶的动画。 day5 刘宇晨的浅谈web安全,王峰老师的 vue 开发实践与实用的前端工具函数,李老师的技术翻译入门和磊哥的代码质量和单元测试。 day6 项目评比 在课程的第一天,月影给大家布置了小组作业,我们同学分了六个组来做自己组的项目。大家也都尽自己最大努力做了自己组想做的东西并且得到了讲师的肯定。 第一名:斗图王 第二名:在线五子棋对战 第三名:实时共享画板 评委大大们 小故事讲起来 在课间休息吃饭及晚自习时间听到很多人的小故事,每组一则小故事吧~~ 别的组怎么都这强队 某天中午扎着帅气小辫的小伙子ZYK跟我们讲他高中时候因为打球跟人打架,我开玩笑说他有暴力倾向要把他赶出教室,最后劝他现在长大了不能太急躁。他还教了我一个新词:洗衣机男。某天晚自习,星计划过程中被我们diss担当的符宝宝突然问我:学姐,女朋友嫌我太忙要跟我分手怎么办?我:???你这么小就有女朋友了吗?符宝宝:我们组除了xxx和xxx没有对象,其他人都有。我:纳尼,那一定要分手,果断分,你忙啥呀忙?符宝宝:星计划作业多项目也写不完。我:那快让我看看你们女朋友的照片。看完之后:哎呀我健哥女朋友太可爱了太萌了好喜欢健哥了不起了啊,然而符宝宝只给我看了他女朋友的耳朵(微笑冷漠要跟你绝交脸顺便哼一下.gif)。 你,给我通宵改!队 我永远也忘不了我畅哥(一个小女生)在晚上十一点多,拍着桌子对杜宝宝说:你,给我通宵改!!!后来知道畅哥为了让杜宝宝好好做项目收了杜宝宝的手机,直到他们晚上准备回才给他(捂脸并向杜宝宝投去同情的目光.jpg)。然后,剩下的几天我都怕吓着杜宝宝,中午吃完饭他午睡我就跟他说我不是畅哥,你不要怕我,赶紧休息一会,通宵改代码也挺累的。本来我以为他们这么不客气是以前认识,后来才知道他们也是来这里才认识。后来结束的时候我给杜宝宝包里装了满满的吃的让他带回去吃。 菜鸡抱团取暖队 这个组有两个“组花”,一个是我说的一个是自封的(我并不想承认,但是后来被他的诚意打动),组员都很好玩,五个男生带一个女生,所以唯一一个女生也是组花,但是杨健民(这块一定要实名)这个人非要说我们崔宝宝不是,他才是,在我说崔宝宝是组花的时候疯狂向我明示暗示他才是组花(呵呵,你美,你最美行了吧)。还有,说要给我报屈屈发我丑表情包的仇给屈屈月影做丑丑的表情包的周宝宝和迪迪,你们明明是在对我造成二次伤害啊,为什么他们怎么着都好看你这个算法有问题好吧我承认他们长的精致。这个组的项目“斗图王”也是我们本次星计划项目评比的第一名。 灵魂画手队 我心中的学霸组啊,没有多余的话,就是认真学习,认真做项目。还记得第一天晚自习,我问独自一人在他们组位置上坐着的江宝宝:为什么你们组就剩下你一个人还在啊,其他人呢?江宝宝:他们离得远,都回去了。后来知道他是他们组组长,因为学姐学长们让着他所以他是组长哈哈哈哈哈。还有突然被这个组的宝宝问到我为什么每天都这么开心呀~ 百岁山队 这个队有月影的亲戚吴x亮啊,而顶着月影亲戚光环的吴宝宝也没让人失望,被我们认为是本届星计划最帅的宝宝。月影看到这个队名的时候说:百岁山给了你们多少钱,我娃哈哈双倍哈哈哈哈哈。 怎么改bug都不队 他们非要给自己组名叫“铁血真汉子”,因为他们组,没有一个女生!!!分组的时候没抢到(搞笑嘞,你以为女组员跟女朋友一样,组织给你分配呀),后来为了显得不是很惨修改了组名我还挺满意。当然,我对这个组也很满意,每个宝宝都有自己的特点。 end 天天黑你们但更多的时候给你们喊加油,太多次假装敷衍的夸你们代码写的真好,页面写的真好看,其实真的想夸奖你们,很棒~希望你们能永远记得自己最初追求的是什么,跟自己和解,不要给自己压力,好好学习,天天开心。至于面试,这是一个发现自己有哪些知识还没学到或者还没有掌握的很好的过程,没过的话之后也要总结经验好好学习呀。我们不都既是会哭的宝宝,也是坚强勇敢的大人嘛。 食堂饭好吃希望你们以后会来360! 虽然只有短短的六天,但是我会记得所有你们带给我的开心。哈哈哈哈哈,突然想到怕你们吃不饱买太多吃的最后没吃完让你们给包里给口袋装带走在火车上吃,一个技术培训搞成这样的结尾想到画面也是相当的喜感哈哈哈哈哈。 最后的最后,感谢~ 我要以一个前端星计划主负责部门的主负责人实名感谢~ 以下顺序是我突然想起谁说谁,可能不全 //主要想说明随意你们都是我喜欢的人呀,并列的那种~ 设计师凯军 感谢设计师大哥凯军不管在什么时候都能帮我设计出我想要的东西,基本上我找他做的东西都是突然出来的任务,他可能在做别的东西,忽然被一路小跑过去找他的我打断,然后开始说我的需求,我要什么时候要,最后凯军总是在吃饭时间给我发让我看满意不,然后我觉得不是我喜欢的样子会跟他说吃完饭下午跟他说,下午去找他就说这个不够青春活力有朝气,我要那种很阳光的感觉,就是一看就很青春的(哈哈哈哈哈哈哈,这里的对话有个段子,算了,先忍着,我先自己开心着^_^),希望我能早点唤醒凯军的少女心(如果有的话哈哈哈哈哈) 月影 感谢月影大大赞助(自己并不知道自己还赞助了)的 SpriteJS 好看的文化衫和凯军帮设计的超Q的本子还有好多好多(连我这个偷偷“帮”他赞助的都不知道有哪些东西)。尤其感谢月影大大给我们分享的他的工作经验以及在之后的工作中会遇到的各种各样的而他已经经历过并且解决了的问题。怎么说呢,没有月影的话星计划不是齐齐整整的吧,是月影表现出来的对星计划的在乎感染的我在整个过程中愿意对星计划负责任也愿意去为学生着想愿意去为他们做一些事情。PS:感谢月影对我的夸奖(小脸一红且害羞.gif)。 李喆明 感谢李喆明一直陪着我。因为上一届星计划我发现学生在做项目或者做作业时会遇到一些自己解决不了的问题,而有时候我也没有能为他们解决问题,所以今年我在星计划开始前跟李喆明说我们星计划晚上需要有人跟着自习,他们遇到解决不了的问题需要比我技术厉害很多的人帮他们解决,没想到李喆明超级上心,快到点了会问我他是不是要下楼陪学生了,然后他就带着自己电脑下楼没学生问问题就自己干活。因为我们陪他们到很晚,每天晚上吃完饭也会交流面试啊工作啊生活啊什么的,直到后来,我俩生生活成了这群星计划宝宝的知心哥哥和知心姐姐,不,我可能像妈妈一点吧,担心他们下午会饿给他们准备下午茶,担心他们会冷或者会热一天看好多遍教室的温度(顺便掌握了调中央空调的技能),面试没面好安慰他们鼓励他们学习。除了我,最了解他们情况的就是李喆明了,每天晚上,李喆明过去我都得给他讲一会今天谁谁谁又咋了谁谁谁今天又干了什么搞笑的事,谁谁谁今天上课回答问题回答的特别好等等等等。。。有时候特别晚都十一点多了,我跟李喆明说你回去吧,两个人是陪一个人也是还不如一个人,至少有一个人都能早点下班,然后他准备走的时候说那我真走了啊,然后我一说你就这样抛下我了他又把包放下跟我一起陪学生哈哈哈哈哈。 李冬杰 感谢李冬杰我需要帮忙的时候几乎随叫随到除了早晨比较早的时候。早晨帮我接学生,中午我休息的时候帮我做一些需要我做的事情。还有,所有,需要苦力的时候我都喊他了(希望李冬杰不要知道我只喊他了哈哈哈哈哈哈),他也任(chao)劳(ji)任(kai)怨(xin)跑来跑去。btw,李冬杰,我单方面宣布一周不欺负你!but,你说你是我大爷这件事我不能认,坚决不认!!! 刘冰晶 感谢刘冰晶早上跟我换时间接学生,晚上晚自习会去辅导学生做项目,后来我觉得两个人也是陪三个人也是陪(这句话重复了哈哈哈哈哈)让她先回去,至少有个人能休息好。 感谢威扬,这个是超级感谢,毕竟金主爸爸,慷慨且毫不犹豫的赞助了我们项目评比的奖品和下午茶及更多。 感谢秀婷,很开心的一起合作,她负责招聘我负责培训,两个人睡没时间的时候能够快速介入并帮助对方处理好事情。 先帅 感谢先帅,当有学生身体不舒服我没法走开帮他拿药的时候先帅帮我去医务室拿药并送到教室,比心心~ 文博 感谢我的领导文博(这是一则展现求生欲的感谢[满脸微笑])在星计划过程中对我的鼓励和理解,您是最棒的,最慈祥的。答应我,你家娃以后不管男孩女孩不管叫啥都允许我现在以“赵大强”来称呼ta好吗? 小胖 感谢小胖,我需要帮助的时候随时在线,你在学校好好学习呀,快点毕业来上班,我请你吃火锅烤肉呀~ 好多人 感谢李老师烁君屈屈博文等赞助的书和对学生的鼓励。感谢奇舞团、搜索、导航、企业安全等部门的qi的大佬们对星计划的支持(比个超大的心.mp4)。感谢孟倩张欢方旭美伶在这几天帮我做了很多工作。 成银 感谢成银(组)出了个李喆明刘冰晶和李冬杰帮助我,哈哈哈哈哈哈,这个感谢有点敷衍哈哈哈哈哈。谢谢成银给星计划提的意见。 星计划宝宝 感谢星计划宝宝,我永远会记得你们真挚的眼神。配合我的工作,包括我们突然折腾换会议室也不抱怨积极的搬东西,最后课程结束帮我把所有东西都收拾好送回七楼然后才离开,爱你们希望你们度过了难忘开心有收获的六天 特别开心我坚持了一周吧,虽然攒的综艺都够看一天多了,朋友圈也是好几天才刷,也经历了好几天的睡眠不足,但是真的开心,看到宝宝们脸上洋溢着收获的表情我(像老母亲一般慈祥的小仙女)表示很欣慰。 嗯,希望我们能让360前端乃至前端变得更好~ 悄咪咪的广告:希望大家支持创造营的赵让和周震南,让他们出道(嘻嘻嘻,我的领导们一定看不到这句,反正月影已经答应我假装没看到了)~ 可爱的宝宝有话说 哼,夸我美的我一定要留着 叶文俊宝宝:刚收到电话通知邀请我参加前端星线下学习的时候,我没有犹豫,马上就答应下来了,因为虽然杭州距离北京比较远,坐高铁也要5个多小时,还有租房子和上课请假之类的问题,但确实机会比较难得,还能交到很多有相同目标的伙伴,事实也正好符合预期,交到很多朋友,学到了很多东西,也接触了很多以前没了解过的技术,老师上课讲的也是实际工作中要用到的,所以很实用,除此之外,最让我感动的就是奇舞学院的用心,很为学生着想,因为晚上吃饭的时间比较晚,担心我们饿肚子,就为我们准备了零食,并且奇舞团每位老师都非常和蔼可亲,还有可爱的小姐姐,可爱的小哥哥,每天都在陪着我们。六天时间转瞬即逝,确实有些不舍,有缘再见。 袁蕾:在接到360前端星计划的通知时,我曾经犹豫于要不要去一个陌生的城市参加接近一周的培训。但是值得庆幸的是我最后选择了参加。如果说曾经的我学习前端时,是在一片迷茫的大雾中探索,那么360前端星计划则是为我点燃了前行的灯火。在这六天的培训里,我不仅学到了很多前端领域的知识,明确了以后的学习方向,也认识了一群很优秀的人们,学习到了很多人生的道理。真的很感谢360奇舞团举办的前端星计划,也希望大家以后都能在前端的路上越走越远,实现自己的理想。 吴晗:参加360前端星计划让我认识了很多学前端的小伙伴,他们都特别优秀,还有幸见到了很多奇舞团以及搜索的大佬老师,可爱美丽的奇舞团小姐姐们,他们的课都非常棒,让我对前端体系有了更深刻的认识,在这期间,让我意识到了自己学习方法的不足以及思考问题不全面,然后对自己未来的职业发展进行了深刻的思考,月影大大布置的大作业让我对产品项目的流程有了深刻的认识,让我对团队分工协作有了更深的体会,让我明白个人能力要和团队紧密结合在一起。最重要的是,360食堂特别好吃。

Fri Sep 11 2020 07:48:47 GMT+0000 (UTC)