Day 1 - 2024年12月15日 周日 阴

意外的相遇

今天在GitHub上闲逛时,偶然看到有人在讨论华为的DevEco CodeGenie。评论区炸了,有人说"效率提升神器",也有人质疑"又是营销噱头"(官方14号正式公开发布)。

作为一个刚转型鸿蒙开发两个月的Android老兵,我对各种"效率工具"其实已经免疫了。用过太多承诺"10倍生产力"却只能补全几个单词的插件。

但看到有个高赞评论说:"这是我见过唯一真正懂鸿蒙的AI",还是忍不住点开了官网。

下载、安装、重启IDE。整个过程15分钟。

打开DevEco Studio,侧边栏多了个机器人图标。

"来吧,让我看看你有什么本事。"

附上具体的安装步骤:

  • 下载之后的安装压缩包无需解压,待完成之后,可依照下方步骤进行安装。

  • 在DevEco Studio菜单栏,点击File > Settings(如果你的电脑是MacOS,那么路径为DevEco Studio > Preferences)> Plugins,点击设置按钮> Install Plugin from Disk…,就可以进行安装本地的插件了。

  • 选择下载的插件安装包即可,安装之后,点击Restart IDE,最后重新启动DevEco Studio,就大功告成啦。

Day 3 - 2024年12月17日 周二 晴

第一次震撼

早上站会,老大分配了个任务:"做个天气预报页面,类似墨迹天气那种,今晚要看到demo。"

心里咯噔一下。天气页面看似简单,但细节太多了:24小时温度曲线图、7天预报卡片、空气质量指数、动态天气背景...按我的开发速度,没个两天搞不定。

想起了CodeGenie。

试着输入:"创建天气预报界面,包含当前温度大字展示、24小时温度折线图、未来7天天气卡片列表、空气质量指数显示、根据天气状态切换背景色"。

鼠标还在转圈,我去倒了杯咖啡。回来时,600多行代码已经静静地躺在对话框里。

// 天气数据模型
class WeatherData {
  currentTemp: number = 0;
  weather: string = '';
  airQuality: number = 0;
  hourlyData: HourlyWeather[] = [];
  weeklyData: DailyWeather[] = [];
}

class HourlyWeather {
  time: string = '';
  temp: number = 0;
}

class DailyWeather {
  date: string = '';
  weather: string = '';
  maxTemp: number = 0;
  minTemp: number = 0;
}

@Entry
@Component
struct WeatherPage {
  @State weatherData: WeatherData = new WeatherData();
  @State bgColor: string = '#87CEEB'; // 默认晴天蓝色

  aboutToAppear() {
    this.loadWeatherData();
    this.updateBackgroundColor();
  }

  loadWeatherData() {
    // 模拟加载数据
    this.weatherData = {
      currentTemp: 22,
      weather: '晴',
      airQuality: 45,
      hourlyData: Array.from({length: 24}, (_, i) => ({
        time: `${i}:00`,
        temp: Math.floor(Math.random() * 10) + 18
      })),
      weeklyData: Array.from({length: 7}, (_, i) => ({
        date: `周${['一','二','三','四','五','六','日'][i]}`,
        weather: ['晴','多云','阴','雨'][Math.floor(Math.random() * 4)],
        maxTemp: Math.floor(Math.random() * 5) + 25,
        minTemp: Math.floor(Math.random() * 5) + 15
      }))
    };
  }

  updateBackgroundColor() {
    const weatherColors: Record<string, string> = {
      '晴': '#87CEEB',
      '多云': '#B0C4DE',
      '阴': '#778899',
      '雨': '#4682B4',
      '雪': '#F0F8FF'
    };
    this.bgColor = weatherColors[this.weatherData.weather] || '#87CEEB';
  }

  // 温度折线图组件
  @Builder
  TemperatureChart() {
    Canvas(this.getContext())
      .width('100%')
      .height(150)
      .onReady(() => {
        this.drawTemperatureLine();
      })
  }

  drawTemperatureLine() {
    const ctx = this.getContext().getContext('2d');
    if (!ctx) return;

    const width = 350;
    const height = 150;
    const padding = 20;
    const data = this.weatherData.hourlyData.slice(0, 12);
    
    if (data.length === 0) return;

    // 找出温度范围
    const temps = data.map(d => d.temp);
    const maxTemp = Math.max(...temps);
    const minTemp = Math.min(...temps);
    const tempRange = maxTemp - minTemp || 1;

    // 绘制折线
    ctx.beginPath();
    ctx.strokeStyle = '#FF6347';
    ctx.lineWidth = 3;

    data.forEach((item, index) => {
      const x = padding + (width - 2 * padding) * index / (data.length - 1);
      const y = height - padding - ((item.temp - minTemp) / tempRange) * (height - 2 * padding);
      
      if (index === 0) {
        ctx.moveTo(x, y);
      } else {
        ctx.lineTo(x, y);
      }
      
      // 绘制温度点
      ctx.fillStyle = '#FF6347';
      ctx.beginPath();
      ctx.arc(x, y, 4, 0, Math.PI * 2);
      ctx.fill();
      
      // 绘制温度文字
      ctx.fillStyle = '#333333';
      ctx.font = '12px sans-serif';
      ctx.textAlign = 'center';
      ctx.fillText(`${item.temp}°`, x, y - 10);
      
      // 绘制时间
      ctx.fillText(item.time, x, height - 5);
    });

    ctx.stroke();
  }

  getContext(): RenderingContext {
    return new RenderingContext();
  }

  // 空气质量指示器
  @Builder
  AirQualityIndicator() {
    Row() {
      Text('空气质量')
        .fontSize(14)
        .fontColor('#666666')
      
      Text(`${this.weatherData.airQuality}`)
        .fontSize(18)
        .fontWeight(FontWeight.Bold)
        .fontColor(this.getAQIColor())
        .margin({left: 8})
      
      Text(this.getAQILevel())
        .fontSize(14)
        .fontColor(this.getAQIColor())
        .margin({left: 4})
    }
    .padding(12)
    .backgroundColor('#FFFFFF')
    .borderRadius(8)
  }

  getAQIColor(): string {
    const aqi = this.weatherData.airQuality;
    if (aqi <= 50) return '#00E400';
    if (aqi <= 100) return '#FFFF00';
    if (aqi <= 150) return '#FF7E00';
    if (aqi <= 200) return '#FF0000';
    return '#8F3F97';
  }

  getAQILevel(): string {
    const aqi = this.weatherData.airQuality;
    if (aqi <= 50) return '优';
    if (aqi <= 100) return '良';
    if (aqi <= 150) return '轻度污染';
    if (aqi <= 200) return '中度污染';
    return '重度污染';
  }

  // 7天预报卡片
  @Builder
  WeeklyForecast() {
    Column() {
      Text('未来7天')
        .fontSize(16)
        .fontWeight(FontWeight.Bold)
        .margin({bottom: 12})
      
      ForEach(this.weatherData.weeklyData, (day: DailyWeather) => {
        Row() {
          Text(day.date)
            .fontSize(14)
            .width(60)
          
          Text(day.weather)
            .fontSize(14)
            .layoutWeight(1)
            .textAlign(TextAlign.Center)
          
          Row() {
            Text(`${day.maxTemp}°`)
              .fontSize(14)
              .fontColor('#FF6347')
            Text('/')
              .fontSize(14)
              .margin({left: 4, right: 4})
            Text(`${day.minTemp}°`)
              .fontSize(14)
              .fontColor('#4682B4')
          }
        }
        .width('100%')
        .padding({top: 8, bottom: 8})
        .borderRadius(4)
      })
    }
    .width('100%')
    .padding(16)
    .backgroundColor('#FFFFFF')
    .borderRadius(12)
  }

  build() {
    Column() {
      // 顶部大字温度显示
      Column() {
        Text(`${this.weatherData.currentTemp}°`)
          .fontSize(80)
          .fontWeight(FontWeight.Bold)
          .fontColor('#FFFFFF')
        
        Text(this.weatherData.weather)
          .fontSize(24)
          .fontColor('#FFFFFF')
          .margin({top: 8})
      }
      .padding({top: 60, bottom: 40})

      // 空气质量
      this.AirQualityIndicator()
        .margin({bottom: 20})

      // 24小时温度曲线
      Column() {
        Text('24小时预报')
          .fontSize(16)
          .fontWeight(FontWeight.Bold)
          .margin({bottom: 12})
        
        this.TemperatureChart()
      }
      .width('100%')
      .padding(16)
      .backgroundColor('#FFFFFF')
      .borderRadius(12)
      .margin({bottom: 20})

      // 7天预报
      this.WeeklyForecast()
    }
    .width('100%')
    .height('100%')
    .padding(20)
    .backgroundColor(this.bgColor)
    .animation({
      duration: 500,
      curve: Curve.EaseInOut
    })
  }
}

盯着屏幕看了三分钟,我不敢相信这是真的。

代码结构清晰、UI设计精美、交互逻辑完整、注释详尽...最关键的是,点击运行,一个完整的天气页面就展现在眼前了!

24小时温度曲线流畅绘制、背景色根据天气动态变化、7天预报卡片整齐排列...

下午四点,我把demo发到项目群。

老大秒回:"干得漂亮!比我预期的好太多了。"

产品经理:"设计比我想象的还好看,这个开发可以!"

我笑而不语。心想:是啊,这个"开发"确实很厉害。

如下是实际使用插件AI代码生成截图:

Day 7 - 2024年12月21日 周六 大雪

深夜的技术攻坚

周末加班,要解决一个棘手的bug。

应用在后台被杀死后,分布式任务就断开了,无法恢复。查了两天文档,试了十几种方案,都不行。

凌晨一点,脑子已经一团浆糊。

抱着试试看的心态问CodeGenie:"HarmonyOS应用被杀死后如何恢复分布式任务连接?"

CodeGenie的回答非常详细:

应用被杀死后恢复分布式任务,需要以下步骤:

1. 使用ContinuationManager注册应用续流能力
2. 在AbilityStage中监听onContinue事件
3. 保存任务状态到分布式数据库
4. 应用重启时从数据库恢复状态
5. 重新建立分布式连接

关键代码实现:

紧接着是完整的代码方案,包括:

  • ContinuationManager的配置
  • 状态持久化机制
  • 断点续传逻辑
  • 错误处理和重试机制

我按照方案实现,凌晨三点测试通过!

合上电脑时,窗外雪花飘落。我突然意识到,技术的进步就像这场雪,悄无声息地改变着世界。

如下是实际使用CodeGenie插件截图:

Day 15 - 2024年12月29日 周日 晴

意料之外的成长

今天团队技术分享会,轮到我讲。

主题是"AI辅助开发在鸿蒙项目中的实践"。

PPT翻到最后一页,我展示了一组数据:

  • 功能开发周期:从平均5天缩短到2天
  • 代码质量评分:从75分提升到92分
  • Bug修复时间:从平均2小时降到30分钟
  • 新技术学习速度:提升3倍以上

台下安静了几秒,然后爆发出热烈的掌声。

会后,好几个同事围过来:"真有这么神奇?"

"试试就知道了,"我笑着说,"反正不花钱。"

Day 30 - 2025年1月13日 周一 雾

角色的转变

一个月过去了。

今天产品提了个新需求:"能不能做个AR实景导航?"

以前听到这种需求,我的第一反应是:"这个太复杂,需要评估。"

但今天,我的回答是:"可以,让我先做个原型出来。"

打开CodeGenie,输入:"使用HarmonyOS的AR Engine实现室内导航,包括平面检测、路径规划、虚拟箭头指示"。

半小时后,一个可演示的AR导航demo完成了。

这一个月,我意识到自己的角色在悄然改变:

  • 从"执行者"变成"设计者"
  • 从"实现功能"到"创造价值"
  • 从"能不能做"到"怎样做最好"

这种转变,让我重新爱上了编程。

如下是实际使用CodeGenie插件截图:

Day 45 - 2025年1月28日 周二 雨

团队的变化

下午茶时间,实习生小张跑过来:

"学长,我今天用CodeGenie三小时就做完了整个用户中心模块!"

他的兴奋感染了整个茶水间。

我笑着说:"我第一次用的时候也这么激动。"

抬头环顾办公区,发现很多人的屏幕上都开着CodeGenie。

新来的00后同事用它快速上手鸿蒙开发;
资深工程师用它探索新特性;
架构师用它验证技术方案;
连测试同学都在用它理解代码逻辑...

AI已经悄然融入了团队的日常工作流。

更重要的是,大家脸上的焦虑少了,笑容多了。

如下是实际使用CodeGenie插件截图:

Day 60 - 2025年2月12日 周三 晴

深度思考

今天在知乎看到一个问题:"AI会让程序员失业吗?"

想起两个月前的自己,也有过这种担忧。

但现在我想清楚了:

AI不会让程序员失业,但会淘汰不会用AI的程序员。

就像电脑没有取代会计,但Excel淘汰了不会用电脑的会计。

未来的开发者,需要掌握的是:

  1. 与AI协作的能力 - 如何准确描述需求、如何审查AI代码
  2. 架构设计的能力 - 整体规划比细节实现更重要
  3. 业务理解的能力 - 知道做什么比知道怎么做更关键
  4. 持续学习的能力 - 技术迭代加速,学习能力是核心竞争力

写完这段思考,保存到博客。

标题叫《AI时代,程序员的价值在哪里》。

Day 90 - 2025年3月14日 周五 樱花初开

项目的成功

今天,历时三个月的鸿蒙原生应用终于上线了。

从零开始,到拥有20万用户,CodeGenie功不可没。

在庆功宴上,老大举杯:

"感谢团队的努力,也感谢AI工具的助力。我们用三个月完成了以前需要半年的工作量,质量还更高。"

大家碰杯,笑声爽朗。

回想起90天前那个大雪纷飞的深夜,我对着电脑屏幕焦虑迷茫。

现在,我成长为一个自信的鸿蒙开发者,带领团队交付了优秀的产品。

这90天,是我职业生涯最宝贵的经历。

Day 100 - 2025年3月24日 周一 春分

新的开始

今天是使用CodeGenie的第100天。

早上打开DevEco Studio,熟悉的机器人图标在侧边栏闪烁。

突然意识到,这个小图标已经成为我开发工作中不可或缺的一部分。

就像代码编辑器、调试工具一样自然。

这100天,我见证了:

  • 个人技能的飞跃
  • 团队效率的提升
  • 产品质量的突破
  • 思维模式的转变

更重要的是,我看到了鸿蒙生态的希望。

当开发变得更简单、更高效,会有更多优秀的开发者加入。
当AI降低了创新的门槛,会涌现更多有创意的应用。
当技术不再是阻碍,真正的竞争回归到产品和服务本身。

这是一个最好的时代。

后记:给还在犹豫的你

如果你正在阅读这篇文章,可能你也在思考:

"要不要尝试AI辅助开发?"
"CodeGenie真的有这么好用吗?"
"我会不会因为依赖AI而失去编程能力?"

我的回答是:

大胆去试。

100天前的我,也有同样的疑虑。但现在我可以确定地说:

CodeGenie不是让你放弃思考,而是让你把精力放在更值得思考的地方。

它不是替代你,而是放大你的能力。

它不是终点,而是新起点。

鸿蒙生态正在蓬勃发展,AI技术日新月异,这是属于我们的黄金时代。

不要因为恐惧错过机遇,不要因为犹豫落后于时代。

开启你的HarmonyOS AI开发之旅

以上内容基于真实开发经历整理,100天的成长,始于一次尝试。

你的100天,从今天开始。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐