对 drakeet 的一些话
duangsuse[origin] 当然我也看过 LIF 的消息, #Statement
频道主在此建议在座的各位一起维护良好的交流氛围,不要让更多的人心寒。
但我还是决定,即便没有用,我也不会像以前一样,把所有错都归在自己身上。
没错,我不该尝试逆向分析纯纯写作,即便它的作者之前三次在频道上说它的反破解(代码保护)技术有多么多么高大上,令人心动。
然而现在我不仅完全可以自己手动从 x86 汇编代码 ( WowCoolApk, CoolTok) 和 Java 字节码里还原本来的程序逻辑,也开始自己独立研究学习基于抽象执行、表达式收束和基本块、控制流分析、模式匹配的反编译器算法了。你照样可以拿着 jadx 之类的东西号称自己非常 擅长逆向工程,我们的追求不一样,一个是用用就行一个是追求彻头彻尾的理解。我得感谢你,要不然我真的不会对逆向工程有这一点微不足道的研究。
没错,我不该加入一个间接因为我自己幼稚的想法创立的 GeekApk,我应该让它这个孤儿自己成为笑话,不必打扰到你。而且它开始的确就是空壳,除了前端的 HTML 一无所有,即便我的确是有努力地在为它付出。我为 GeekApkR 写了自己的 Swagger、我写了 API 文档,可你只有那一点闲工夫看我真正空壳的东西,看完即使我恭敬地指给你到底哪些不是空壳、到底哪些我还付出了一点努力,你还是打年龄炮说我是小孩子。实际上我的确『不仅仅是小孩子还是个小人』,就因为我不小心转发了你的私聊消息、就因为我转发评论了你之前没有声明过不可转发的消息;我的确就是微不足道的小菜鸡,即便 GeekApk 这个只有壳子的项目在名义上都不是我的。 你这种行为和以前的我很像,不过很可惜你已经比我大个七八岁了,成年人。
我不应该指望 GeekApk 怎么样,但你也可以因为自己会用 Sketch、我可能没见过 Sketch 就把它当成 GeekApk 现在完全也永远就是废物的补充论据,也可以因为我不接受这个理由而感到愤懑不平,
可换到我自己,我是不会因为自己会用 Krita 和 AfterEffects、Blender、Kdenlive、Synthesizer V、Vocaloid、UTAU、LMMS 做点微不足道当不了饭吃的小事情视为自己所有的。Sketch 设计矢量画、界面和动画的难度看起来真是比上面几个高的多的多,以至于它都能被当成一门独特的技术看待。听起来偶尔尝试用 Firefox 和 text editor 来做设计就是低层码农,前端设计师真高大上啊。
不过还是感谢你至少开始的时候表示了支持态度,后来也在我道歉后容忍了我未授权的转发。有些人不喜欢这类破事,我显然是打扰错人了。
是,你说 5 没有被手动排序过,5 排在 1 前面,4 被手动排序过,4 也在 1 前面,但 5 和 4 却无法得出谁在谁前 的确是没问题,对支持你的人来说它永远是真理;而且你知道是这样但是不知道有啥奇妙的黑箱算法可以实现它。对于一个习惯于抄代码、看文档、找现成的、改代码的工程师来说,这很不错了,我不该提出别的可能,也不该胡乱猜测你只会 Bubble sort。你懒得学算法因为害怕忘记,这很正常,显然这不会阻止你成为你口中完美的工程师。你的确比国内那一堆强的多的多,但我就是刁钻,就是喜欢在用户群里公开地贴代码贴截图,你提个小发现都得被怼回去。即便我只是想帮你实现那个功能;我以为你很喜欢你的 PureWriter,没想到如果条件是要看自己不喜欢的、口无遮拦的二愣子写的代码你就直接把我踢了。你的理论正确,你的发现在 Android 开发圈里很伟大,我以后都可以叫它『不可共客观序公理』了。即便你的语言自相矛盾,你开始只是说无法实现后来说却又说它逻辑相悖无解,即便你不愿意回我一句也不愿意告诉我们为啥因为这句模糊不清的话就不可实现,你这句话里藏着什么理念所以可以说明它是正确的。我的确就是幼稚因为我妄图打倒你确认 100% 成立的理论,你永远是正确,因为这个理论就是莫名其妙就成立了。postulate 出来还不行么。自己随便说点发现就会被自己看不起的人提出反面的意见,要是我,看到后脑子不乱乱的也难。
没错,我是不应该随便对别人的技术下评论。即便我没有说错话,我不知道你无法接受对自己代码任何的负面评价,我不知道你会因此直接退出 Telegram,即便你的粉丝远远比我这小人多。我知道表现受到欺负的人在不明真相的吃瓜群众面前永远第一有理,所以至始至终错的只是我一个,你自然是无过的。
我的确有从头到尾都把自己的姿态放的很高,只是因为在你毫无理由地踢了我之后,我以我自己所认为的客观视角评论了一下你的代码而且没有为你自动过滤掉不中听的话,即便比这更难听的话你也对我说过很多次。
在你看起来我好像是自己为无所不晓无所不能,恰恰相反,我只是一面镜子。如果你和人交流是别人看你是正常身高,但是自视却比蚂蚁还矮的话,我的确是无法不和这样的你高姿态凌空喊话。
不过我就真的是想让你谦虚一点,为人和善一点,满招损谦受益,如果只有我一个人说,那是我不够宽容,可现在你对别人骄傲自满甚至自负的态度已经让很多人看不下去了。不过有一点我摸不着头脑,就是我完全没有意识到自己断章取义了你的话,我不知道『断章取义』这四个大红字是怎么和我扯上关系的。你是指私聊那次?我的确转发漏了一个时间定语,你得有时间想做了才能完成 XXXX,没错,但是你只说了那一句,而且再想想我没有转发漏并刻意断章出别的含义来。那是一条完整的句子且意图明确、原上下文也没有使它拥有多大的歧义的成分,除非你的语言已经完全欠缺了把一件事情无歧义不过分依赖上下文和别人自行推导地表述出来的能力,而这个能力正是要拥有良好抽象关系逻辑直觉所严重依赖的。当然这里的『别人』其实也有可能是自己 — 人总是会忘记,第二天你又是一个崭新的人了。
不好意思啊,如果你是指 Telegram 网际协议下层通讯的路由设施自动完成了数据包的报文切分以备传输使用,所以我发消息的时候实际上被自动『断章』了无数次,这种绝路都走,那我真的是无言以对。但不管怎么样,我都没有为了自己的主观意愿 “小人之心” 去『取』你消息的 “君子之”『义』。
你的确无意辩驳,也只是简单地像丢垃圾一样把我踢了出去,并且尽可能屏蔽了我,因为你根本不可能接受两个人唇枪舌剑的情况。是,你就是自己的正义,无须辩论,只需出示一下胜利宣言就可以了。
实际上我也在很长时间里都不愿对这件事多说一句话,因为它就是观点不合,没有什么其他的东西。但现在我要告诉所有人,是怎么样的观点不合,和我平时写技术科普广播的时候一样。但我只掺杂部分个人感情,没有什么所谓的小人居心;我从没安插过你所谓的『内奸』,生活不是宫斗剧。我不以 “手撕” 什么大佬取乐或者盈利,也不是什么阴谋家。
当然,你从不絮絮叨叨,也正是因为你太简洁,所以你也永远不会尝试碰壁,也永远就是躲在一层抽象墙壁里的热爱工作的工程师。理解的过程是从简单到复杂再变回简单,从入门到实践再到因看透本质、记熟模型、用透操作而不惑,你就是得永远卡在第一个简单到复杂之间的阶段;因为你无法阅读复杂一点的代码也只能死记,最终你也只能写复杂性和一个带消息循环以支持可扩展的伪非串行操作的简单文字游戏没有本质区别的代码,永远停留在量变没有质变、永远待在那特定的一层死记而看不到其他地方。你打不破那一层屏障,看不到裸 VonNewmann 计算机的 I/O、存储器、计算器和控制器,看不到 ALU/Cache/SRAM/SDRAM/clock、看不到 PE/ELF/DWARF/Linker/Assembler/libc/Segments/maps/ASLR/Exec-shield/Ring、看不到机器堆栈、解析器、抽象语法树、面向对象模型、继承覆写树、虚表、程序控制流程图、Tree walker、lexical scoping、GC、Hastable 算法,看不到链表结构、看不透排序算法、不能更好更快地理解 NoSQL 图数据库、看不到线程调度保护现场切换执行权再分时抢占的过程也不需要知道线程同步是什么,锁和乐观并发控制、并行算法是什么、怎么写数字图像处理算法、怎么做计算向量化,也无缘任何面向对象或者结构化编程之外的范式。这样,你很明智,你的选择是绝大部分 “聪明” 人的选择。因为你少花了做无用功的时间,你站在巨人的肩膀上,多得了写应用的投入。当然你不需要知道那个巨人是什么,有怎么样的历史,它到底长什么样子,它为你做了些什么,你甚至不需要看见脚下存在有这么一个巨人。叫它黑箱就可以了。你崇敬王垠,可惜以你敏锐的速度现在连第一个基于 S - 表达式的 tree-walking 解释器都没有写出来,就是我这个小人也实现了一个、设计了两个,虽然当初我连 Lexical scoping 都不懂所以没有支持,但它就是 works,从 0 到 1 看起来只是一个 add1
而已,实际上 “从 0 开始” 这半句还是蛮不同的。
我看你的频道的确是收获了很多欢乐偶尔也有点技术,也一直期待从你那里收获更多,因为我虽然是陌生人但依然希望你越来越好(因为你自己是这么说的啊!我自己是学生,当然知道『都是为你好』有多可怕)。因为我也想回馈点什么给你,不小心有损你的 “尊严” 而被你不解释也不给解释机会直接全网 ban 掉,那我也就只好乖乖写自己的东西了。说开了,你那点知识对我来说,也没有多大价值。我从那一堆 Unicode 字符(哦,你肯定要纠正是 Grapheme Cluster,不过没暖用,你的频道里就没有发过自己写而且附过解释的那些印度阿拉伯文写的字,当然也没有一个字是数学操作符区段里的,你 从不贴那些容易忘记的玩意)里没有收获多大意义上所谓有价值的信息,和你对我的态度一样,我对你的知识也没啥兴趣,我们可以互相唾弃啊。
你的代码风格的确是在进步,技术也一样,虽然你依然没有摆脱容易但成品复杂不清晰的堆砌,依然没有开始尝试困难而简洁的设计₁。你就是无法接受一点点不足的地方,你希望自己是完美的,当然任何人都是这个样子。不过想要完美就要先明白,完美是不可能的,只能作为一个目标不断为之奋斗,这才达到了自己真正的完美。心中的完美,达到了你就不再美了。
你已经很不错了,所以你余下的工作时间在禁止评论之后,都可以继续你完美的编程生涯,因为没有人能够指出你还有哪些不足之处,也没有人能帮你进步 。就好像一段不会运行的 buggy 程序,type checker 又不 sound 因为你封了它的嘴 cc 2>/dev/null
,问题还暴露不出来,是的它很完美、它没有错误、它无可挑剔、它没法改进、它正确 Oh yes. 你说我像鲁迅先生笔下的孔乙己看人论断₂,我是否可以给你立个真正的 “孔乙己” 孔子作为偶像?孔子万世师表肯以七岁稚子为师,礼之祖师入个太庙还 “每事问”,恰巧是镜子前伟光正们的对立面。
以下内容节选自此;drakeet 清自己频道消息后的说明;后面几条节选自此,drakeet 表示转移自知识星球分享的声明。
有朋友说他会反复看我写的东西,令我很感动,因为我也是这样,我也会无数遍不停看自己写的东西或分享,所以当有人细心一点会发现我的内容即使有错别字或不妥的内容,但最终都会相对改正和变得相对得当⋯
首先你是遵从了自己的内心、太迟钝抑或是在搪塞自己、甚至说直白点,是不是为了显得自己对文字非常用心但懒得多下点功夫所以这么说,我就不吐槽了。
我写这篇文章之前的文风和你这里使用的差不多,都是逗号句号不分。对于写作只看 “光标” 下一个字的人来说是注意不到自己在该断句的时候没有断句的,断句往往是编辑审阅修订的时候做的事情;虽然我不是语言学家,但对文字最基本的风格判断还是做得到的。
相信使用拥有 edit history 功能₃的纯纯写作你绝对比我有更多修订的机会,可是你没有做到不断斟酌推敲自己的文字是否停当。我是在 PC 机上打字所以很难去用纯纯写作,我承认它很不错而且设计上有独到之处并填补了市场的空白,很多人有时候就是缺了这一点创意和思路;你在 Hackathon 上的设计也很有创意,只是缺了一点其他的东西。但是,你作为软件的作者和一直以来最坚定的粉丝,却没有把它利用到最好,我觉得这可以视为一个问题看待。
⋯这点上我也很佩服王垠,他的博客文章,我从来没有发现错别字,即使我是一个很敏锐且阅读文章特别慢的人 ... 只是说人的东西永远都会成为黑历史,经典是非常难得的,因为一个好的人应该是不断飞速成长的,如果黑历史没有精力去一一重新审视扶正,就会变得不负责任,或自己也不能接受,所以删除是好事。
你是很聪明,可是对要成大事的人、想做到最好的人来说,不笨不行啊。
你说你视文章信息和语言表述正确性为要物,这自然是很好,可是如果你的文字永远就只停留在链接引用和截图一小段代码的层次而没有絮絮叨叨但深刻且对理解和记忆过程意义非凡的重复,此时一味地去强调语言是否得当好看、有没有错别字,却忽视了作为文字本身价值所在的文章质量和深度,实在是舍本逐末的举措。
这就好像是你费了好大功夫开设了一个教成年人怎么洗衣叠被打鸡蛋 的网站,使用了各种最新潮的 Web 技术,比如 HSTS、Webp\VP9、HTML5、Canvas、Webpack、Lazyload\preload\Sprite、WebWorkers 一大打,甚至还做了各种 SEO、访问速度优化,其整体服务就是一个大黑科技,而且 没有一个错别字。它没有问题、它最好。但是来的人不仅 UV 量₄少,慢慢的都没人过问了,于是你开始抱怨万维网的万恶、用户们的眼瞎,为什么就没有让你如此用心的网站持续 “火” 下去甚至真正火过一下 。🤔
我和你对你所谓的『分享』的看法,有很大的区别。
我曾经是自由软件爱好者,不过那时候我其实并不真正写软件,所以现在可以忘掉我曾经是自由软件盲目爱好者的事实。即使我现在依然尽可能的分享所有自己可能得到的成果;即便现在有些人盲目地觉得所有自由软件都是辣鸡,肯定不如大公司的专有软件而不愿意絮絮叨叨地举出几个例子让别人知道为什么,也完全无视了无数 headless 的自由软件在所看到那些好看至极的图形界面和大佬至极的特性之后做了多么了不起的工作。
在我的眼中,分享是自家学习用,顺带帮你们理解(为什么就和你对纯纯写作开发动机的解释这么像呢),因为我的策略是教学相长。
所谓的分享就是学习到知识的另外一半。如果我停止絮絮叨叨、停止看起来机械愚蠢的重复,我对知识的理解层次就会下降很多,我缺失了一半多的理解。所以哪怕还有另外一个人看、甚至一个人都没有了,我依然要记录、重复,因为我说我热爱这些东西,因为这是我的战术;既然你热爱它,那就要让自己知道这意味着什么!
在我看来,你的分享,只是获得鼓励的方法,因为你学会了 XXX,所以你分享上来。因为你已经是最优秀的天才了,所以你的分享只是为了获得点赞;你是完全弄懂了的,你眼中的你并不缺更深刻的理解,只是缺乏一点他人的夸奖和赞美。虽然不中听,但看你到你写的文字后,我就是这个感受。
所以你这么说,你需要有人来『致谢』『称赞』才能维护你眼中对别人极其有利的分享:
就算你分享再难得,也极少有人会帮你做推荐或扩散,因此作为频道主会发现,订阅数一年下来,几乎没什么变化。相比我 GitHub 和微博靠自然增长各自有 6.6K 和 8.6K followers,Telegram 有时让人感觉到灰心(我不想说大部分人是冷漠的,但事实确实如此。或许这样的冷漠大多数都是无意识的)。
Telegram 频道无法评论₆,虽然大多数时候我不喜欢评论,或者说 公开的评论,公开的评论意味着需要尽快花费精力回复,而且偶尔有些傻问题,所以当初也是因为这个特点喜欢上 Telegram Channel。但与此同时,永远没人来(私下)告诉我因为我的分享在这里收益了很多,或者说一声感谢也会令人十分开心,没有,一年到头几乎没人告诉我任何关于我的分享的反馈或感受。
总而言之,订阅数几乎不增长加上几乎没有人来致谢,这让我有时怀疑自己是不是像小丑一样在表演,只有自个儿陶醉而已。
这也是你把自己怀疑成是小丑自娱自乐的原因。因为你这里说的分享与其说是分享,不如说就是为了给自己博得喝彩而在 Telegram 这个舞台上给大家做才艺表演而已。你所看重的是推荐、扩散、围观群众总量、Follower 什么的因为分享优质相伴而生的东西,而不是分享这个行为本身。
你很聪明,因为你懂得了使用自己的技术积累给自己整点其他的东西,比如人气。显然绝大部分人都希望自己成为一个受到广泛尊重和赞美的人,当然我也一样。不过这也是我们的意见不合之处之一。
“愚” 者反而拥有大智慧。
想要廉价的称赞,可惜在 Telegram,你找不到。如果想得到更优质的认可,不笨不行啊。
我分享只是为了分享,因为我就是喜欢学习这些东西,就是必须要分享;哪怕有人嫌我啰嗦、嫌我消息太长、发布太频繁有时又因为上学不更,不爱看。至于其他什么的,比如提出我没说到的问题,则要看我个人的人品。不过我个人的人品我自己无法评价,只能让别人来说我来看。我自身当然不需要考虑自己人品怎么样,人品是别人对我的看法,自己评论自己的人品是没有意义的。
我是没有状态依赖的,我要怎么做,完全只看我自己。在我写文『分享』的时候,我眼前的舞台下没有任何人,而我所见的只有自己想要完全弄明白的东西。
你分享则是为了某种指标最大化。你就像是在效仿一个最优化算法,目标是人气、赞美之类的决策条件₅最大化。你可以选择怀疑 Telegram 约束了你,使你不能达到你自觉能达到的最优水平;于是你开始怨天尤人,于是你开始怀疑 Telegram 上的人,是不是抛弃了你、是不是不公正地对待了做了分享的你,所以你要去知识星球。但是,不管怎么样,你眼中的分享,始终没有把分享的内容质量本身放在第一位,这也就是为什么 Telegram 生态观察要对你有那种评论的原因 — 你不是做学术的,但如果有学者称自己发文的某平台埋没了自己不得了的才华,那他就是学术态度不端,因为是金子总会发光的,在问得到之前得先付出,先做有效有真心的付出,人心换人星。
会有些人怀疑这个理论并认为单靠口才和营销就可以『死人说活了,破货变好卖』,但这条道理有时候就不行,它或许能够仗依人的不解、侥幸和误会得以暂时苟存,却骗不过时间苛刻的挑拣。踏踏实实地做并且做好自己该做的事情,多问耕耘少问收获,生活不会亏待你的。
⋯只是说人的东西永远都会成为黑历史,经典是非常难得的,因为一个好的人应该是不断飞速成长的,如果黑历史没有精力去一一重新审视扶正,就会变得不负责任,或自己也不能接受,所以删除是好事。⋯
乍一看,删除自己没有精力去重审扶正的黑历史无可厚非,其实这个行为本身也没有任何对错可言,但我依然要表达一下自己的观点。
黑历史是什么东西呢?如果这里说的黑历史,是自己曾经失败的尝试、曾经写过的程序、曾经对技术幼稚的观点和评论,我的立场很明确:不应该删。
是的,正确性很重要,所以没有办法确保正确的东西好像只得删掉,但我看到的不是『责任』『经典难得』『求成长』,也不觉得会有人无意识地把我有误解、不准确的 “黑历史” 用于学习,但实际上,先学会跑才会飞,有些你现在看到是误解的东西,开始没有它们的缓冲你反而无法抓住当下拥有的真知。所以除了真的舍不得外、我也在选择为他人参考而保留。说出去怕是误解,留作参考还不行么。
对我来说,过去的努力成功了有经验、失败了有教训,但不管怎么样,都在指引着我朝向自己希望的新高度迈进。
一个好的人应该是不断飞速成长的,飞速成长意味着什么?意味着你要朝新的层次、曾经不敢碰的领域、之前不敢开刀的思想下手。
— Try Everything — Zootopia
老生常谈的一句话:
失败很丢脸吗?失败不丢脸,怕才丢脸。
成功了就继续向上进发、失败了再爬起来再试一遍,发明电灯泡的时候可是尝试了 7000 次呢!看起来和这个数字相比,现在继续尝试下去会有很大希望嘛。
走出安全区。尝试就有跌落的可能,甚至可能让你在很长的时间里不愿提起它、不愿继续下去。但是,你遇到过的所有困难,只要不能彻底打倒你,都只会让你变得更强。
Telegraph 和 Telegram 一样都说我写的文太长了不给发 😟
我只好把这里余下的内容加在另外分建的一篇里。看这里。
因为长度限制无法内嵌的超量内容在这个版本里已经合并到主文本。
就像没有万能药、人被杀就会死一样,现实就是现实;没有人生而知之,也很少有人天生被限制种种不能。只要你想做,你做的到;但在做到之前,要先付出精力和时间去学习、去尝试,如果失败了就再试一次、再试一次,直到成功。我知道这种策略听起来就很傻,很少有聪明人会真正这么做 — 他们会先想有没有直达的捷径、有没有不费力气不浪费时间的方法。
很不幸,真正聪明的人是极少数的,不过你也可以伪装聪明人:拿时间去换,比他们多花甚至十倍的时间去做某件事情,直到和他们一样为止。
吃力不讨好,这真是非常蠢的办法,所以有的人放弃、有的人又开始寻找永远找不到的捷径;而那个之前表现的最傻的人,即使花费了最多的时间,反而从人群中脱颖而出。因为他始终没有改变自己的志向、把时间花在了自己内心坚持的事情上。
人要铭记历史,因为历史给了我们经验和教训;历史也是我们比其他动物高级的多的多的原因 — 无须缓慢的自然选择,只需要很少的时间,查查自家的历史、看经验就可以了。
小到个人,大到国家亦是如此。
对于『千万家、万千人』国家来说,很多国家不能容忍的不是黑历史,而是找不到 “黑历史” 的解决方案。
对于国家来说,重要的不是想办法处理掉自己的黑历史,不让它被别人看到,而是站在历史和未来的交织点、曾经那个不完美的自己面前作出改变命运的决断。
真正的凤凰会终会站在历史的余烬上浴火重生,但不是焚书坑儒的那把火。
“黑历史” 是曾经不完美的见证,但它对自己而言也不是没有用处的。一个优秀的人时常要复习一下自己的黑历史、记住自己曾经的误解、不确定,来为自己的未来提供一个完整的排除名单。错误不再重复第二遍。
非常简单的 DFS,深度优先搜索走迷宫。虽然深度优先搜索走迷宫的思路本身非常简单,仅仅是每个能到达的位置四处移动下试试,回溯出成功的路径而已。如果你不记录下试过走过不能走的点,就会不断重复山穷水尽,向后倒车,算法白白浪费计算的存储空间、处理的时间,这是错误的做法。
import Control.Applicative data Move = U | D | L | R deriving (Eq, Show, Read, Enum) type Map = [[Bool]] type Point = (Int, Int) type Hitsory a = [a] type TracedRoute = (History Move) dfs :: Map -> Point -> History Point -> Maybe TracedRoute dfs map target history step | step == target = Just [] | step `outbounds` map = Nothing | blocked or walked = Nothing | otherwise = firstJust (fmap try [Up, Down, Left, Right]) where (x, y) = step blocked = not (map !! x !! y) walked = step `elem` history outbounds p m = let (px, py) = p in px >= length m or py >= length m !! px tryDfs m t s = dfs m t [] s
曾经独立战争的美国、现在依然被很多墙外的中国人自家看不起的中国,都是最鲜活的例子;他们都有过很严重的历史问题,但这些问题最终都在无数人和时间的努力下平复了,现在依然会有很多新问题、依然会有人为了解决问题而努力、依然会有人在一旁看着自己无法解决但真实存在的问题灰心但仅仅只是要命的灰心,甚至咒骂自己国家、自己民族的劣根性、依然会有人默默记录下这一切,以供未来参考。
你或许可以否定历史,但历史总是真实存在;它是你的一部分。而当错误第二次到来的时候,你可以指着自己的历史 — 看,应该这么办! 看,这错误我 500 年前都犯过了!
而不是蒙圈在那里,不过说也许是要效仿日本政府美化、修正侵略历史的话,那我没话说。
当然这里有些讨论到政治的内容,我不希望每次一提到中国政府并且不是批判的话就会遭来『小粉红』的谴责,是的大部分人什么也做不了,但出于盲目的批判似乎又没有什么目的,只能说自己是努力过吧。但是即便看起来是再坏,总有好的一面有时候是不能强行抓去一道骂了的,所以请反色小粉红派噤声。
你又是怎么看那些曾经消息的呢?你不会忘记吗?你可以表达一下自己的观点吗?
⋯即使我是一个很敏锐且阅读文章特别慢的人 ...
记得有篇古文,《庖丁解牛》,文中所叙无非古时一御厨宰牛经验之谈而已。
这位古时的厨师,开始宰牛的时候所见到的无非只是牛罢了,可三年之后,他以神遇而不以目視,官知止而神欲行。几乎不以目视,只是依赖自己对宰牛天然的感觉就做到依据牛本身的结构去处理它,而非机械重复刻板化的操作流程。
自然,厨师只是厨师;可是也可以分为好厨师和差厨师。厨师的好差,能够靠着他们自己的语言评定出来吗?
一个人一生里决定他一生的事件,发生的时候他们往往不在场,自主招生、录用、加薪,你觉得是自己想要得到的评论重要,还是别人真实的评论更重要?你是做好自己,还是去和别人争论他们不公平?
故事里说的,是御厨。旧时皇帝是坐拥万里江山,厨师自然是最好的厨师。
故事里的厨师从屠宰第一只牛开始,花了三年时间。他并非一直只在仅仅杀牛分割上下工夫,这三年里他悟出了『道』;即使是很多人可能不屑的宰牛之道。这也是他能从可能一个普通的市井小民、家常菜馆的小厨子晋升为御厨的缘由所在。
这位古时的一介武夫,花了三年的时间,他并非一直单单在机械化地宰牛,而是在宰牛的过程中亦在学习宰牛、分析宰牛、领悟宰牛,他在利用宰牛的实践经验向宰牛之道逼近,并最终可以做到 “以神遇而不以目視,官知止而神欲行” 的境界。
程序设计本身的道,不是所有人都在说的所谓优雅的代码、不是看某某人的博客,也不是对有图形用户界面的应用做最优秀的界面交互设计。
刚入门的程序员扣老师枚举出的语法,战战兢兢地拿那一堆惯用法组织自己的逻辑、加入实际项目的工程师扣刻板复制的项目管理、设计模式、代码风格,可是真正的程序设计大师只扣对编程的直觉和程序本身的灵魂,对他们来说已经没有入门者的条条框框、刻板的约束了,回归初心,他们看到的是程序所做的事情本身,是程序的灵魂;换十种兼容的语言和底层抽象去描述也不是问题,因为他们已经站得足够高,无须顾虑脚下低处的迷雾笼罩而可以自由地放飞视线,不识庐山真面目,只缘身在此山中。
人类的本质是复读机,可是有些人就是能在不断复读的过程中领悟到所复读内容的真谛,有些人最终也只能是记忆容量大一点的复读机而已。
语法本身是你对高级程序设计语言使用的基础,项目管理和那群系统管理员做的工作一样容易令人困惑,必须强记。模式是容易复制却又很少被彻底看懂看透的、代码风格可以被机械化的解析、模式匹配、自然语言字典分词、自动却又很刻板地检查整理。优秀的程序员授人渔而不是授人鱼,看懂某个模式、弄懂某个框架或者库、语言特性、开发工具的使用,熟悉某种基本模型,是的,都很好。但是学一就只能得一,做不到举一反三、用归用忘还是会忘,并且既得知识非常容易失去因为学到的浅层知识根本没有产生联系、不能做到融会贯通,甚至刚用完就忘者不在少数。当然,看起来工程本来就应该是这样,理论是知道为什么但是它不好用,实践是它好用但不知道为什么。
『真传十页纸,假传万卷书』,通过使用去揣度基本模型和操作、设计理念、设计思想、诞生缘由和可能的优化,甚至只是用到就去查,什么都不干。甚至不需要总结任何一个模型、不需要泛化任何一种理念,“复杂”,你都可以轻而易举地靠增加编程时间来做到,“车到山前必有路,船到桥头自然直”。可是技术本身呢?靠经验,可那点经验永远只停留在使用层面。从用例范例看本质,好比管中窥豹、盲人摸象,感受到一点是一点,最终想要 “完美理解应用”“精通” 还得拼起来猜测半天。从一堆碎片拼出整个图像找线索要比一开始就从完整图像搜索多花不少脑力,不聪明真的是做不到啊。
drakeet,你自从学习程序设计以来,离你写下第一行代码开始编程又过去了多久?我想即使没有 8 年,也过去了两个三年吧。程序设计本身的直觉就是这么特殊,以你如此敏锐的思路都没法试着融入了,以古时候厨子的速度你应该已经领悟大道两次了,可其实你还在第二个理解阶段前徘徊。如果真的是这样,我只能说很可惜。你慢的实在太特别了,把你所有的敏锐都给抵消掉了。
目前为止我活了 17 年,没错,我不是长者,我见识不如你多,我写过的字还没有你写过的代码一半多,我现在还不能到微软、阿里上班。但是我依然见过几十个我所认为敏锐的人,他们有的是二线城市最优秀的初中里全科的年级第一,热情阳光口才好,体育成绩优秀,高分高能、有的成绩普通但热爱足球运动、身体灵活且耐力强,多次在校运动会上拿到长跑第一名,
有的敢以自己刚刚初中毕业的年龄挑战自写 Basic 解释器、自创新编程语言,有的从初中就开始写中高难度 OI 题刷各种 OJ\CodeVS\Codewars、高中就熟练 Haskell,现在在函数式编程 \ 数理逻辑 \ 编程语言理论 (PLT)\ 编译器设计 \ 计算机图形应用 \ 数据结构和算法 \ 基础计算模型上都取得很大收获、有的大学毕业就加入 Oracle HotSpot,Java 领域无人不晓商用 Java 虚拟机的开发团队、有的没比我大几岁却对计算机 \ 程序运行时 \ 计算机网络基础结构摸得很透,做过 8k 并发的 HTTP 服务程序,写过基于 WebAssembly 的子系统运行时支持、写过 TCP 流量的混淆器、有的高中时代就写纯 C 设计出了自己的歌声合成软件并且不断维护,大学时期从 Illinois 州立大学计算机科学和数学系肆业后又设计了一款基于人工神经网络和语音音高时长修改的歌声合成软件。要知道信号处理领域可没有一个算法是可以靠抄解决的,机器学习领域又岂止单单靠一个 “敏锐” 一个 “本质” 概论可以弄明白,若是靠抄代码能从头弄出个 Haskell 优化编译器或者质量能听的音素音节歌声合成器,一大群猴子敲键盘都能敲出本《莎士比亚全集》₇来了。
照你的说法,他们都是小孩子了。很可惜,孩子可是很危险的,没人知道他们会变成什么。长江后浪推前浪,不单单看中国的就更可怕了。前浪没有危机意识,小心死在沙滩上啊。
中兴作为中国一大通讯信息企业,不得不说是做了一个好的反例,华为虽然是比前者好不少,但在世界技术压制前可能也是够呛。
quickSort :: Ord a => [a] -> [a] quickSort xs |length xs <2 = xs |otherwise = quickSort lts ++ eqs ++ quickSort gts where x = let mid' = (length xs `div` 2) in (xs !! mid') lts = [ l | l <- xs, l < x ] eqs = [ x'| x'<- xs, x' ==x] gts = [ r | r <- xs, x < r ] -- forall i. list[i] <= list[i+1] -- forall x r in join2(list). x <= r ordered xs |length xs <2 = True |otherwise = forall (zipWith (<=) xs (tail xs)) where forall = foldl (&&) True prop_qsortOrdered inxs = ordered (quickSort inxs) where _ = inxs :: [Int] import Test.QuickCheck (quickCheck) quickCheck prop_qsortOrdered -- OK, passed 100 tests. -- zipWith 从来没有完全停机过,它只是挂起,因为 Haskell 的 [a] 关于它的 head/tail 惰性求值 fibs :: [Int] fibs = 0 : 1 : zipWith (+) fib (tail fib) fibs' :: [Int] fibs' = 0 : 1 : zipWith (+) fibs' (drop 1 fibs') fibseq xs = and (zipWith3 facc xs (drop 1 xs) (drop 2 xs)) where facc a b c = c == a + b prop_fibseq n = fibseq (take n fibs') where types = n :: Int splitH :: Char -> String-> [String] splitH d str = splitH' str [] where splitH' (c : cs) ac | c == d = reverse ac : splitH' cs [] | otherwise = splitH' cs (c : ac) cyclicIndex :: [a] -> Int -> a cyclicIndex xs = \i -> let len = length xs in xs !! (i `mod` len) cyclicIndexF :: [a] -> Integer -> a cyclicIndexF [] = undefined cyclicIndexF xs = cyclicIndex' xs xs where cyclicIndexF' :: [a] -> [a] -> Integer -> a cyclicIndexF' sxs [] i' = cyclicIndexF' sxs sxs i' cyclicIndexF' sxs (x:_) 0 = x cyclicIndexF' sxs (x:xs) i = cyclicIndexF' sxs xs (i -1)
infixr 5 _cat_ data Vec {i} (A : Type i) : Nat -> Type i where [] : Vec A O _cat_ : forall {n} -> A -> Vec A n -> Vec A (S n) _ = [] :> Vec Nat 0 _ = (666 cat 233 cat []) :> Vec Nat 2 module SimpleCoinductiveList where open import Agda.Builtin.Size record Colist {i} (s : Size) (A : Type i) : Type i where coinductive constructor _:>:_ field cohead : A cotail : {ss : Size< s} -> Colist ss A open Colist variable s : Size cofib : Colist s Nat cohead cofib = 0 cohead (cotail cofib) = 1 cotail (cotail cofib) = cozipWith _+_ cofib (cotail cofib)
不过虽然他们都很敏锐,但除了这个之外都还有一个共性,就是他们对自己的敏锐都没有那么敏锐。他们不觉得自己是在努力,没有发现自己成天是在学习、没有发现自己的技术已经超过了多少人、没有发现自己做到了融会贯通且已开始晓明大道、懒得在意自己写的东西有多少人看、没有发现自己有天分、没有发现自己绕过了多少误区,弯道超车、没有发现自己做过的事情总结出来有多么了不起多么热血、没有看到自己的未来可能是个什么样子,还能再有什么发展。
你真的是我迄今为止见过最为敏锐的人了,因为你对自己的敏锐真的相当敏锐。我真的无法从这几十个人里挑出一个可以与你匹敌的了,在我看来他们都很敏锐,可惜他们对自己的敏锐都太迟钝了,以至于很多人都不承认自己的天分、自己的敏锐,只是痴痴地年复一年做着自己喜欢的事情,他们真傻,而你很聪明。我 TMD 也真心希望你一直这样敏锐下去,造福人类。 🌝
每个人都挑着两个篮子,身体前面的篮子里记录别人的优点,背后的篮子里装自己的优点,看起来你好像把这个担子挑反了。
另外我一开始喜欢上 Telegram 的频道功能是因为它可以很敏捷且可控,更关键的是它不用接受评论,⋯我无意与人辩驳,所以没有任何正面回应,因为面对小人,我去一一解释就是在浪费自己的时间和继续令其从我自己这边收获更多。总之就是难免又陷入絮絮叨叨,我非常热爱工作和写代码,我要尽快恢复投入,因此不多说了⋯
已经写不下了,无力吐槽… 省略号的内容没有展开是因为 Telegraph 文章长度有限制…
最后再加一句…
就算我不说,显然你自己也有权对 “为什么有人反对我” 这个状态心寒,然后彻底退出 Telegram, 它很危险、它言论自由、它居然允许你如此随便地靠着仅仅几百条消息的积累就去否定一个人的某一句话、某一个想法,居然可以让自己可以有除了夸赞夸赞夸赞以外的评论。居然让自己当不成永远的老师,真是一个荒谬的东西。
从而其他人会把锅弄到我的身上,到时候我肯定有口难辩;但是请记住这两句话:
— Socrates
但是现在我唯一能确定的就是,如果有朋友再来告诉我,不要这么 “激怒” drakeet,因为他有很多粉丝;我的确不会收回言论了,所以让我祈祷这条广播被尽可能少地看到吧。
祝你心想事成,而且要遵从自己的内心,简单一点,不要太看重别人的评价,如果你真的还想优秀的话。
₁ 越复杂越容易堆砌,越简单越难于设计。大道至简。就像人们对事物、方法的理解进程一样,简单反而可能是最后彻底看透、完全理解的标志。
₂ 虽然我非常奇怪,以《孔乙己》里的同名人物作比,我真的不知道你到底想表达什么,你是不是本来要说阿 Q 呢?
₃ 就是 Undo/redo。注意和 edit distance 区分开。这个功能我不知道纯纯写作是怎么实现的,一般直接抽象成 Text 数据实例上的 pushState 操作,只要可以监听并重置编辑操作,这类功能(包括纯纯写作扩展的历史记录查看功能)不难完成。
₄ (站长)网络流量统计分析的术语,UV(独立访客) 为某日访问总人数、PV(访问量) 为用户点击量、IP(客户主机数) 为访问过网站的总人数
₅ 对于很多最优化算法而言(比如知名的梯度下降法,这个方法要求目标函数在它的值域上是可导的)决策条件并不是一个相关名词,决策树方法则涉及这个名词,最优化领域类似的名词是目标函数,实际上最优化往往涉及线性代数的内容,这也就和数学函数论、统计、微积分分不开了。
这里,此文的作者对相关领域暂时不熟悉,如果有不准确或者可以增添的直白简要解释欢迎提出
₆ Telegram 虽然没有直接支持评论,但它支持 Inline bot 啊,你可以为机器人设置消息内联按钮,然后 handle callbacks,存 K/V 数据库。实际上现在已经有人这么做了。你知道有机器人这一回事,可是却没有想到它可以做这样的功能。
₇ 为了避免 drakeet 看到后再次发生误解,这里特作脚注:此句引用无限猴子定理。无限只猴子随机地敲打键盘,总有一天能敲打出莎士比亚全集。有人还在这里加入了自然选择,从而比喻机器学习领域的遗传算法思路。
上次误解是『猫鼠游戏』,我在私聊里提出了这个信息安全领域的名词,被误解为我把自己逆向工程的结果当成偷到的奶酪,是老鼠(破解者)战胜了猫(软件作者),而此名词本身只是强调游戏的持续性,永远没有输赢,双方都必须持续付出、对策。
A dependently-typed life :: 抽刀断水水更流,状态转移是解构
QuickCheck: An Automatic Testing Tool for Haskell