<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>zhishu520 (阿树)</title>
    <link>https://beta.w2solo.com/zhishu520</link>
    <description>https://apps.apple.com/cn/app/%E6%97%A9%E6%99%A8%E8%AE%A1%E5%88%92/id1542908683</description>
    <language>en-us</language>
    <item>
      <title>人到中年失业，走向独立开发</title>
      <description>&lt;p&gt;大家好，我是阿树，一个中年失业的程序员。&lt;/p&gt;

&lt;p&gt;23 年 11 月因为做手术需要休息，就辞职了，没想到今年找工作难度异常大，BOSS 上投了几百份面试就几个约面试，而且没下文了。&lt;/p&gt;

&lt;p&gt;唉，特别焦虑，后面就想着走独立开发的路线。&lt;/p&gt;

&lt;p&gt;现在开发了个 IOS app 叫远忧，主要是 对抗焦虑，缓解焦虑的 app，灵感来源于我失业后的焦虑心态。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apps.apple.com/cn/app/%E8%BF%9C%E5%BF%A7-%E8%BF%9C%E7%A6%BB%E7%84%A6%E8%99%91%E7%83%A6%E6%81%BC/id6479553183" rel="nofollow" target="_blank"&gt;https://apps.apple.com/cn/app/%E8%BF%9C%E5%BF%A7-%E8%BF%9C%E7%A6%BB%E7%84%A6%E8%99%91%E7%83%A6%E6%81%BC/id6479553183&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;最后，希望国内程序员的环境会越来越好。&lt;/p&gt;</description>
      <author>zhishu520</author>
      <pubDate>Thu, 28 Mar 2024 17:09:38 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/4511</link>
      <guid>https://beta.w2solo.com/topics/4511</guid>
    </item>
    <item>
      <title>我是怎么用 SwiftUI 开发出一款独立 App 的</title>
      <description>&lt;p&gt;大家好，我是阿树。&lt;br&gt;
两个月前，我还是一名游戏全职开发者，因为厌倦了 996 的强压工作，想试试做一名独立开发者。一晃已经两个月过去了，我的 App 已经上线了 app store。&lt;br&gt;
我想写一点总结一下开发的整个过程，下面的是 app 下载链接&lt;br&gt;
&lt;a href="https://apps.apple.com/cn/app/%E6%97%A9%E6%99%A8%E8%AE%A1%E5%88%92/id1542908683" rel="nofollow" target="_blank" title=""&gt;「早晨计划」app store 下载链接  &lt;/a&gt;&lt;/p&gt;
&lt;h2 id="1.  我要做一个什么样的App"&gt;1.  我要做一个什么样的 App&lt;/h2&gt;
&lt;p&gt;在一开始其实我已经有一些想法了，因为我经常工作完没事就开始玩游戏，对自己的生活未来没有规划，我不想时间如沙子一样从手中流逝，最后一无所获，同时我也需要有一款软件来帮助我在独立开发者这条孤独的路上前行，所以我想做出一款早晨利用早起一小时计划整天的工作，让自己有计划的生活，而不是随波逐流。&lt;/p&gt;
&lt;h2 id="2. 技术栈的选择"&gt;2. 技术栈的选择&lt;/h2&gt;
&lt;p&gt;确立了目标，第二步就需要做出技术栈的选择，首先独立 app 的话首选应该是 IOS，因为 IOS 的用户付费意愿比较高。我没有考虑安卓，因为安卓的机型比较复杂，跨平台开发的话，会消耗我大量的精力，在平台上。所以只考虑了 IOS，同时我选择了最新的 SwiftUI 来开发，因为看着比较顺眼，不喜欢手动拖拽拼界面，实际用下来感觉 SwiftUI 开发速度也很快！
用户的数据都存在本地的 sqlite 里，没有放后端，后端的话只用了 python 的 flask 做一些后端基础服务，比如说支付的验证。前后端的交互也会浪费大量开发时间，而且服务器也比较贵，所以就基本不依赖服务器。&lt;/p&gt;
&lt;h2 id="3. 设计App的界面"&gt;3. 设计 App 的界面&lt;/h2&gt;
&lt;p&gt;说实话，我基本没怎么设计界面，就是按照感觉走的，朴素简洁风。比如说下面的目标界面，就是很朴素的 app store 的风格。我个人就是比较喜欢这种简单的美，让界面显得不多余。&lt;br&gt;
目标界面：
&lt;img src="https://img.way2solo.com/photo/2020/c3c5610d-1bcc-4303-93f7-57783b6fbcb0.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;任务界面：
&lt;img src="https://img.way2solo.com/photo/2020/17adc5be-cf4b-4917-b54c-762a6e5d86bb.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="4. 代码开发"&gt;4. 代码开发&lt;/h2&gt;
&lt;p&gt;1 尽量使用开源库，减少开发工作量
代码目前代码的开发占据了大部分的时间，本着能用开源库就用开源库的精神，减少工作量，收集了一些 swift 的库。  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SQLite.swift 操作 sqlite3 的库，我的大部分用户数据都是用 sqlite 去存储的。&lt;/li&gt;
&lt;li&gt;Alamofire 网络请求库，api 比较友好简单，易于使用&lt;/li&gt;
&lt;li&gt;Toucan 图片处理库&lt;/li&gt;
&lt;li&gt;FSCalendar 日历控件&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2 使用简单的框架
有人说过这么一句话，调试的复杂度是代码复杂度的两倍，当你写出来的框架足够复杂的时候，可能你已经没有能力去调试其中的 bug 了。我只使用了简单的 MVC，MVC 的好处很多，有个最明显的好处就是降低耦合，减少重复代码的可能。&lt;/p&gt;

&lt;p&gt;3 遇到多 Google，多 Stack Overflow
因为 SwiftUI 普及度还没那么多，文档也没那么多，加上新技术不稳定，有 bug 是肯定的，这时候多用关键字去搜索，国外的大佬还是挺多的。  &lt;/p&gt;

&lt;p&gt;4 重构
当代码看着不顺眼，可能就要开始重构了。我这里有两个重构的经验，一是事不过三，如果重复代码超过三次说明需要提取成一个函数。二是如果想破脑袋也没办法给提取出来的函数命名就不要提取合并代码。一个不明所以的函数可能比 bug 更糟糕。&lt;/p&gt;
&lt;h2 id="5. 上架"&gt;5. 上架&lt;/h2&gt;
&lt;p&gt;不需要等产品完美了再上架，因为追求完美其实是一种不可取的事情。没有用户反馈的情况下，做任何优化都有用户不买账的风险，先做出个大致的情况，测试几遍没有 bug 之后就可以考虑上架了。我上架的时候第一次被拒绝了，因为使用照片权限的描述不够清楚。第二次审核的话很快，用了两天就过审了。  &lt;/p&gt;

&lt;p&gt;以上就是我所有的总结，如果有任何疑问都可以跟我私聊讨论， 微信：zhijzan。&lt;br&gt;
最后，我是独立开发者阿树，希望你过的健康幸福！&lt;br&gt;
&lt;a href="https://apps.apple.com/cn/app/%E6%97%A9%E6%99%A8%E8%AE%A1%E5%88%92/id1542908683" rel="nofollow" target="_blank" title=""&gt;「早晨计划」app store 下载链接&lt;/a&gt;&lt;/p&gt;</description>
      <author>zhishu520</author>
      <pubDate>Tue, 22 Dec 2020 19:29:28 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/766</link>
      <guid>https://beta.w2solo.com/topics/766</guid>
    </item>
  </channel>
</rss>
