分类: 随笔

  • 2024年学习记录

    记录

    一方面是持续提升自己,让自己未来在能够接到更重的工作的时候能够胜任;另外一方面也就是持续的学习,保持自己的竞争力,别哪天真的没工作干了。
    作为技术人员,一方面要拥有很核心的技术,深度要深,广度要广,而且要持续跟进最新的知识,有持续的产出,所以,一方面努力学习,一方面努力写代码。

    链接:
    https://cpxwidm62n.feishu.cn/base/HRiqb4hAga8J77smUATcc8qenme?from=from_copylink

  • 梳理python的import

    最近公司出了一个bug,我有点不太懂python循环import会发生什么,也不知道python是怎么处理的,周末顺着文档缕了一遍python的导入系统。

    官方导入系统的文档:https://docs.python.org/zh-cn/3.12/reference/import.html
    本文主要是记录一些细节、自己的理解以及一些注解。

    基本介绍

    import

    import: import语句包含了两个操作:

    1. 它先搜索指定的模块,如果不存在会创建改模块;
    2. 然后将搜索结果绑定到当前作用域中;

    展开来说,就是import首先会调用__import__将模块拿到引用,然后import会处理名字绑定相关的操作,类似于

    import math         # 将math模块绑定到locals()的math
    import abc as a     # 将abc模块绑定到locals()的a
    from abc import d       # 将abc.a绑定到locals()的d上

    __import__

    看完前面的,__import__就很清晰了,它在设计上是仅用来做搜索以及在没搜到时创建模块的功能的,但是虽然不会影响globals()和locals(),但是会修改sys.modules。

    模块和包

    模块:Python只有一种模块对象类型,所有模块都属于该类型,无论是从python还是C++实现的类模块。
    包:可以将模块理解成文件,包是目录,包可以拥有子包,也可以拥有模块。

    包又分为常规包和命名空间包,常规包就是目录有__init__.py的包,命名空间包就可以让一个包内的模块不在同一个目录,甚至

    注:

    • 包是为了帮助组织模块并提供名称层次结构,Python 还引入的概念。
    • 所有的包也都是模块
    • 拥有__path__的模块会被当做是包

    加载模块

    [原文]
    当一个模块说明被找到时,导入机制将在加载该模块时使用它(及其所包含的加载器)。 下面是导入的加载部分所发生过程的简要说明:

    module = None
    if spec.loader is not None and hasattr(spec.loader, 'create_module'):
        # It is assumed 'exec_module' will also be defined on the loader.
        module = spec.loader.create_module(spec)
    if module is None:
        module = ModuleType(spec.name)
    # The import-related module attributes get set here:
    _init_module_attrs(spec, module)
    
    if spec.loader is None:
        # unsupported
        raise ImportError
    if spec.origin is None and spec.submodule_search_locations is not None:
        # namespace package
        sys.modules[spec.name] = module
    elif not hasattr(spec.loader, 'exec_module'):
        module = spec.loader.load_module(spec.name)
    else:
        sys.modules[spec.name] = module
        try:
            spec.loader.exec_module(module)
        except BaseException:
            try:
                del sys.modules[spec.name]
            except KeyError:
                pass
            raise
    return sys.modules[spec.name]

    循环import的问题

    主要文章: https://www.jb51.net/article/51815.htm

    # 文件A.py:
    from B import D
    class C: pass
    
    # 文件B.py
    from A import C
    class D: pass

    这个过程会直接报错,但是如果将from A import C改成import A就不会报错,这是为什么呢?
    可以看到前面的文档里的内容,包括这段开头的文章。
    在import时首先查看是否存在这个模块,如果存在,则直接获取,如果不存在,则先创建一个空的占用,然后再执行loader.execute()

    两个连续的from xx import xx发生的事情就是,在第二次执行from A import C时,会发现sys.modules里面已经有A,那么import做的事情是获取A.C,然后把引用放进globals。

    但是这个A是个空的模块,所以就Trace了。

    End

  • 反思一下中途开香槟

    很久没好好开发了,之前一直推脱是卡在数值,但是功能上还有很多缺失,内心有点抵触这个各种事情的继续推进。

    行百里者半九十,深刻体会到这句话,前面志得意满太多了,炫耀获得的满足感太多了。

    心里就有一种很错位的自豪,这一件很伟大的事情我已经做完一半了,但是遇到真正的困难和复杂我就开始踌躇不前,我会找很多听起来合理的推脱借口,听起来一定是合理的,我这方面的嘴上功夫真的是一流的,我太清楚自己了。所以要彻彻底底从未来的结果倒推,东西能做出来那就OK,东西做不出来那就是又一次遇到demo向完整的作品转型会遇到的困难,然后自我垮掉了。

    无论是游戏开发还是B站账号,都是有一点小成绩小成果,然后就停滞了,我好像一直是这样,不止是这两件事情,在我身上的好多事情都是这样,前期快速推进,中期就停滞不前,最后能落地的屈指可数。

    虽然每件事儿的卡点都各不相同,当事情不止一次发生就只能倒推出是我自身阻塞住了,甚至有时候我还会想,我是不是就适合做这种先驱型的工作,但回过头就觉得这是一种傲慢,巨大的傲慢。

    一个完整的优秀的事情,它是不是虎头真的不重要,最重要的只有两件事:
    1、完成这件事情;
    2、结局是完整的,达到目标的;

    半路开香槟这个事情是我的问题,需要深度反思一下,我现在是获得了一点点的关注和影响力,但是远远不够,必须要全部做完!!!

    回到亡灵集结号,现在的框架要支持更复杂的技能好像很麻烦,我想要做多功能合一的按钮好像很复杂,我想要去可以在修建状态和战斗状态分别操纵小兵好像很麻烦,现在AI无论多远都会自动寻敌这个事情不好,但是想改好似乎对AI框架的修改相当多……

    诸如此类,我大概是在潜意识的有一些感知到这些困难,并且开始逃避,享受前半段的错位就好,后半段的艰辛我不想干了。一次又一次一次又一次,哎。

    我真的还挺讨厌自己的,太熟悉以至于太了解缺陷,又太想自己好以至于经常苦恼。好在是从一次又一次的挣扎中,学会跟自己对话。找一个大片的时间,坐下来不去思考,就是打字,意识流的敲键盘,然后混乱无头绪的思绪就会先像岛屿漂浮起来,欲望、挣扎和方向会像可视化的方式浮现在眼前。

    要做的就只有一件事情,连线,也许内在的心理运行机理不是连线这样,但是对错这件事情不是最重要的,最重要的是有一个合理的解释,并且继续向方向前进。弗洛伊德的是对的吗?阿德勒是对的吗?该从孩童时期的伤害中去寻找自我还是从否定自我的存在主义中寻找自我,真相很重要吗?不重要,这些只是让我们健康的工具。感冒能好就行,谁在乎是体质原因还是哪种药更有用。

    1w粉有点难了,保证每个月2个视频吧,大概是这个产出数量,然后游戏要在6月底开发完,git提交要忙碌起来了。

    中途可以开香槟,但是结局的香槟最重要,完成就是胜利!!

    End。

  • 很想买小米14

    这两天一直在被新手机诱惑,很想买小米14.
    不得不说,铺天盖地的宣传,好看的机身都很不错,性能提升也很夸张。挺吸引人的。
    我仔细想了一下,我买手机好像从来不是因为这些宣传,而是因为上一台坏了。

    有必要吗,其实日常性能完全够用的。

    挺纠结的,再等等吧

  • 关于制定计划

    脱离于时间去谈计划是很难执行的,例如我如果制定一个计划,周末读一本书,这就是一件可以让自己快乐的口号,但它不具备成为计划的价值。

    我周末要学blender,要看python源码都是如此的口号,口号和计划是非常相似的。

    一个可执行的计划是过程主义和结果主义的巧妙平衡,既能就事论事地量化目标,同时还会考虑到执行所需要的时间以及代价。

    例如我周末要看一本书,是一个不好的计划,它没考虑书的长度,这个计划跟我的关系很小,它是口号。

    我周末要打开三次这本书,每次至少读一页,这是一个增强执行力的计划。

    我周末要看8个小时书,每天4个小时,这是一个相比看一整本书更可行的计划。

  • 夸夸金铲铲之战

    周末玩了一下金铲铲,二十把上到铂金,一把半个小时,10多个小时就被吃没了。

    惊叹于装备的设计,卡能不能Carry取决于装备和英雄的结合。

    更惊叹于随机的懂人心,抓住每个流派期待随机系统的调整,直接给到玩家。

    尤其惊讶于商业模式的简单,真的是有钱的捧个钱场,没钱的捧个人场的模式,什么都不买能体验到所有的游戏内容,没有一点内容阻碍。

    当今几乎所有的免费游戏,比如王者、第五人格、永劫无间,这些想体验到全部的游戏内容是需要付费的,因为英雄是需要买的。

  • 人做不了超越自己认知的东西

    人做不了超越自己认知的东西。

    如果相信苹果眼镜上市之后会引领潮流,那么安卓阵营也不会停滞,那如果这个时候我下场不做ToC,而是做ToB,我去思考AR/VR设备里所需要的硬件,例如玻璃,例如按钮。

    但是这个是很难的,我没有工厂资源,我也没有上游厂商的供应链资源,我空有一腔想挣钱的热情。

  • 注重过程的结果主义者

    我一直以为我是一个过程主义者,但是最近我才瞄到我是个结果主义者,甚至抵达结果有些许的不择手段,只是手里的武器不多,否则我应该是一个很恶劣的人。

    我只是会在达到最终结果的路上,设立很多小的目标。

    注重过程的结果主义者。

  • 保持优秀的信息摄入

    之前写了一篇关于表达很佩服云峰的内容,他10年期间github的提交以及博客的更新是非常厉害的。今天又多一个让我钦佩的大佬:Erik Wernquist。

    视频《ONE REVOLUTION PER MINUTE – a short film by Erik Wernquist》 https://erikwernquist.com/one-revolution-per-minute。

    我不知道他是谁,但是他这个作品很浪漫,很厉害。

    最近有点复古,开始寻找优秀的个人网站和频道,不太商业化和蹭热度的那种,用feedly去看那些大牛的日常和产出。

    觉得这个是一个不错的思路,跳过平台去关注有意思的内容生产者,进一步的是寻找一些榜样。

    他们的东西会淋我在身上,同时随着雨滴炸裂开的还有源源不断地新鲜灵感。

    还是那句话,保持优秀信息的摄入。

  • 低代码平台和降本增效

    看到低代码平台,心里就开始吐槽,这有啥用啊。

    然后愣了一会

    这平台不是给程序员的,这个就是给普通产品的开发工具。我本能地想从性能上反驳,但是从python的大流行去看,从摩尔定律失效来看,个人设备的计算力早就过剩了,绝大多数的产品需求是不需要那么强大的计算力的,所以性能低又怎么样,降低对程序员的要求是一个不可阻挡的趋势。

    趋势也不是今天才开始,几十年来计算机行业的迭代本身就是降本增效。即降本,也增效。

    没人能用汇编做出来一个原神,开发语言和工具的不断进步,既降低了对开发者的要求,也提高了项目能达到的规模。在开发的过程中也在优化开发过程本身。

    这个时候,AIGC如神降临,而在某个虚空倒计时开始默默转动。

    今天摘抄的一句话:产品是资产,代码是负债。

    你的产品解决了客户的问题,因此是你的资产。代码则是创造资产的成本。你拥有的代码越多,阅读、测试、更改和理解所付出的成本就越高。

    写的有点悲观,虽然趋势不可挡,但是抛开时间去谈趋势就是扯淡,而且落实到我自己身上又是另外一个课题。