首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
V2EX  ›  Python

如果能解决这种等级的问题,在码农里大概是个啥水平?

  •  
  •   kaoneiliusi · 208 天前 · 5418 次点击
    这是一个创建于 208 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前几天在招聘网上和豆瓣的一个运维开发类岗位负责人接触,出了一道笔试题。 我看了下原程序是 C 写的,但是自己看了看自认为虽然给我俩礼拜我学习一下应该能完成,但是短期内应该完成不了(半吊子运维出身代码能力不行) 于是给谢绝了。 不过还是很好奇,大概什么程度的码农能一天左右完成这题呢?

    基于 ncdu 实现一个命令行工具,用来定位文件系统中占用了较大空间的文件、目录。 需求场景描述 在运维工作中,经常会遇到磁盘空间被写满的情况,大部分情况是根分区。这种情况需要尽快处理以免影响系统上其它服务。这时候就需要去定位是哪些文件、目录占用了较大空间,以此判断是哪个服务异常,进而解决问题。在文件系统中找出大文件是一件非常耗时的事情,当 inodes 数很大时尤甚。

    好在 ncdu 高效地完成了扫描文件系统各文件、目录占用的工作,但是要达到我们的目标——直接将大文件展示出来,还需要做一些额外工作。

    要求说明 实现一个在 Linux 环境下运行的命令行工具,命令行参数符合规范。注意,是基于 ncdu 实现一个新的命令行工具。 以人为本,便捷易用,能够最大程度减轻 SA 的在这件事情上的时间消耗。

    除命令帮助信息 -h, --help 外,对使用场景及对应的相关命令做简单文字性描述。

    会从命令接口设计、代码实现、开发风格、使用场景设计、执行性能等角度去评价这个命令行工具。

    推荐优先使用 Python 实现,但原则上实现语言不作为评价依据。

    完成的项目需要放到 GitHub 上面,建议保留完整的 commit 历史,需要写清楚如何运行。

    最终提交的是 GitHub Repo 页链接。

    36 回复  |  直到 2018-09-29 11:07:15 +08:00
        1
    lance6716   208 天前 via Android   ♥ 1
    并没有看到明确的要求,连要点都交代的工作并不想干
        2
    widewing   208 天前 via Android
    为什么要基于 ncdu,ncurses 的程序怎么“基于”。。直接遍历文件不是更方便吗
        3
    widewing   208 天前 via Android
    @lance6716 就是说选择目录,列出目录中的大文件吧。并且能够选择进入子目录继续查这种吧。
        4
    newborn   208 天前
    我感觉我能用 bash 写一个出来。那个要求不是说可以用 python 吗?这不基本上就是脚本语言调 ncdu 执行文件对输出结果进行重新编排或者执行过程简化和控制。
        5
    xuanbg   208 天前
    1、可以设置忽略路径,因为有些路径没必要去扫
    2、剩下的从根开始递归遍历,得到所有文件的大小,以及文件夹下所有文件所占用的空间。
    3、可以对第二个功能得到的结果排序
    4、可以单个删除文件或直接删除文件夹
    5、可以设置监控路径,实时刷新数据

    另外,为什么要做命令行工具,明明是图形化界面更方便
        6
    xuanbg   208 天前   ♥ 2
    除了本身就是搞这种工具的,一般人一天是搞不定的。这个和编程水平无关,编程首先得要知道干什么,然后需要知道怎么干,最后才是写代码。写代码也许一天就够,但不是天天和这类工具打交道的,前面两步搞定差不多也要三天往上了。所以一般人 1 周搞出来属于水平很高了。

    划重点:能独立搞出来的才叫程序员,让别人告诉你怎么做才能搞出来的叫码农。
        7
    imdong   208 天前
    直接系统原生命令写个 shell 不就能实现了?

    du -sh /*
        8
    AX5N   208 天前
    感觉我没看懂难在哪,不就是遍历所有文件拿到每个文件的大小吗,那之后干啥不都是随便?
        9
    0044200420   208 天前
    一次性列出,不要求后续交互,那很容易吧
    首先,看可以不可以导出结果文件,不用跟 ncdu 交互
    开始面向 google 编程,ncdu export 第一条,哦,自带 json 输出,那后面的就简单啦
    https://dev.yorhel.nl/ncdu/jsonfmt
    粗略设计,按扩展名、路径、大小进行过滤显示,差不多了吧
    ncdu 应该支持过滤参数吧,不行就清洗 json 咯
    让我一天来做这个,可以慢慢划水交货
        10
    lolizeppelin   208 天前 via Android
    考察点之一 参数处理 注意 这是运维开发 给运维写工具的 命令行参数处理不好怎么开发


    考差点 2 高效扫描文件 说实话这我都不知道咋弄 得看相关 c 工具的代码 估计最佳做法是用 c 写 Python 的计算太慢了
        11
    lolizeppelin   208 天前 via Android   ♥ 1
    我看过 python 代码里
    命令行参数处理做的最佳的就是 openstack 的配置文件模块了 屌得一 b

    把这直接抄了 配置文件和命令行部分直接满分 232
        12
    lolizeppelin   208 天前 via Android
    哦 扫文件已经基于 ncud 了 那就简单得一 b 了
    直接掉库就是
        13
    lolizeppelin   208 天前 via Android
    命令行这玩意 好好写一天不一定够

    但是 一个好的运维 早就面对我这个问题了
    各种工具 salt stack ansb 什么的都有可参考的对象
    也就是说肯定老早就有一套现成可用的了

    现在还没现成的说明你积累不够 水平没到

    挺好的一道题目
        14
    enjoyCoding   208 天前 via Android
    设计加编程实现加文档 一天?? 这公司不缺人吧…
        15
    tab   208 天前
    背景知识:Linux/Unix 环境编程(了解 file descriptor,会自己实现个 ls, cp 命令啥的),Python,C,如果你都比较熟悉而且看你描述好像给了 C 语言的源程序,就是主要逻辑翻译一下查查 ncdu 实现再加一些细节逻辑一天肯定不是问题。如果不是很熟悉需要自己了解的话,尤其是操作系统命令行这些东西,可能需要额外学习了解,时间视个人能力和基础水平不定。话说回来,运维岗位的话,如果 Linux 和 Python 不熟悉,那你自己是存在短板的,这些不熟悉应该很难写出运维自动化的脚本,估计平时用的运维工具具体实现和原理大概也不够了解。实际上这种题考查的知识点运维应该比很多程序员要有一点优势,尤其是现在大前端各个平台各种面向应用层的码农,他们平时很难接触到这些。
        16
    WordTian   208 天前 via Android
    感觉能写,但是我肯定一天搞不定,估计得一周
    先是熟悉 ncdu 的详细用法,再加上命令行选项设计,估计就得一两天,开发得一两天,优化估计再一两天...
    emm...看来我还太菜了
        17
    aijam   208 天前
    @0044200420 基本同思路。一小时出 prototype,半天基本能搞定。
        18
    ryd994   208 天前 via Android
    一直都是 du -a --max-depth=1 | sort -n
    反正有缓存,实际上就是第一次跑时间长,后面都很快
    SSD 的话就更不用说了
        19
    SuperMild   208 天前 via iPhone
    划重点,扫描的具体实现是直接用 ncdu !要做的只是处理参数输入和结果展示而已。
        20
    taowen   208 天前
    重点是 以人为本,便捷易用

    这是考察产品分析和设计能力吧
        21
    lsls931011   207 天前   ♥ 1
    然后拿到答案,你可以回家等消息了
        22
    okjb   207 天前
    @lsls931011 真的皮
        23
    crayygy   207 天前 via iPhone
    这个问题描述看着还真的有点像骗代码的。
    详细的文档和 help,详细的 commit 和使用说明,建议使用指定语言(便于以后维护)。
    希望是我想多了吧
        24
    swulling   207 天前 via iPhone
    刚毕业的学生给一周时间应该能写出来符合要求的

    工作一两年的可以在两天内完成

    再往后就和能力无关了,这个题的能力要求本来就比较低
        25
    sampeng   207 天前 via iPhone
    刚搜了一下 ncdu。这写个程序满足需求很难?
        26
    newtype0092   207 天前
    @crayygy 看着乱七八糟的要求很多,可实际具体使用方式并没有限定,就只给了个“直接将大文件展示出来”的要求,要是骗代码肯定会指定输入输出吧,不然自己设计的接口他们拿到完整的东西可能也很难用。
    当然不排除招聘方连设计接口的能力都没有或者懒得做,看谁的方案好用谁的。。。
        27
    lihongjie0209   207 天前
    在文件系统中找出大文件是一件非常耗时的事情,当 inodes 数很大时尤甚。

    好在 ncdu 高效地完成了扫描文件系统各文件、目录占用的工作,但是要达到我们的目标——直接将大文件展示出来,还需要做一些额外工作。



    题目中要求的关键是展示!!!

    文件系统遍历是 ncdu 帮你做的, 文件系统的扫描结果也是 ncdu 帮你定好了, 按照一个传统的三层架构来说,

    presentation layer (你的任务)
    service layer(ncdu)
    dao layer(ncdu 导出的 json)

    你的任务就是写一个展示层把 ncdu 的导出的 json 文件展示一下好了.




    题目的关键: 但是要达到我们的目标——直接将大文件展示出来

    这里我们可以做一些合理的推论, 要展示的不只是大文件, 还有大文件夹, 毕竟这个也是一个合理的需求.

    那么你的程序在设计的时候主要的功能应该是大文件 /文件夹排序, 比如说展示 top10 的大文件 /大文件夹


    其他可以想到需要优化的地方:

    1. 缓存, 每次扫描整个文件系统其实还是很耗时的, 如果说你的文件系统在一定时间范围内是稳定的, 那么可以加一个缓存, 这样别人在基于你的命令开发的时候会感谢你, 不然调试一个 grep, awk 都需要几秒钟那就太痛苦了.
    2. 导出你的结果, 类似于 ncdu 一样的提供一个 json 导出
    3. 执行性能, 这个东西需要看使用场景才能优化, 没有 profile 就别优化, 但是你需要在你的程序运行时写出足够的日志来帮你做 profile.




    ----------------------至于说什么水平--------
    我是 Java 开发, 无法评价运维水平. 这道题目中涉及到的 ncdu 是我第一次接触, 花了 15 分钟看文档和下载下来跑 demo, 还得感谢题主让我了解到一个好工具.
        28
    newtype0092   207 天前
    @xuanbg 题目要求的是基于 ncdu,这个东西本身就是能在终端里使用的图形化工具,而且功能复杂。
    现在要求“直接将大文件展示出来”,相当于从瑞士军刀上拆个小刀头过来,再自己装个手柄。
    干什么(显示大文件)和怎么干(封装 ncdu )已经比较明确了,算是码农都搞得定的要求了吧。
        29
    liangdu   207 天前 via Android
    这问题没难度,思路也很好讲。用来作为面试考察点,看出出题者意图不善。加之,他问了一个似乎很无聊的问题"一天能不能搞定?",这个没做过就不能,有做过就可以可以。只能说明面试官真的不缺人才,缺流水劳动力
        30
    xxgirl2   207 天前
    自带的 getopt 就能处理一些复杂的东西了,不过要打印用法的话 getopt 可能会显得繁琐,或许应该找找别的轮子
        31
    wuweidong0107   207 天前
    ncdu 是什么,找大文件为什么要基于 ncdu 找?它有什么优势吗?能不能用 find 命令找?
        32
    superhan   207 天前 via Android
    一半人阅读理解不过关,还有一些根本不知道 ncdu 说明没有运维经验。这题挺有用的
        33
    ifaii   206 天前
    @superhan #32 混了多年运维 真不知道 ncdu 是啥,这种需求 du 配合 sort 一下都有了
        34
    CheneyC   206 天前
    监控服务器空间使用情况-crontab+python 邮件提醒
    https://my.oschina.net/ailou/blog/1547982
        35
    xavierskip   205 天前 via Android
    想起来之前看过相关的博文 https://blog.lilydjwg.me/2017/8/11/ncdu-diff.210359.html “谁又用掉了我的磁盘空间?——魔改 ncdu 来对比文件树大小变化”
        36
    foxyier   201 天前
    被骗过代码的路过。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2477 人在线   最高记录 4385   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 20ms · UTC 00:38 · PVG 08:38 · LAX 17:38 · JFK 20:38
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1