WhistleDev All articles
Investigative Tech

Code Rot from the Inside: Seven Unethical Development Practices Hiding in Plain Sight

WhistleDev
Code Rot from the Inside: Seven Unethical Development Practices Hiding in Plain Sight

Photo: dark computer code screen magnifying glass investigation cybersecurity audit, via img.freepik.com

Code review catches bugs. It catches style violations, inefficient queries, and the occasional off-by-one error that would have taken down a service at 2 a.m. on a Friday. What it rarely catches — what it is almost never designed to catch — is intent.

Unethical development practices are not always obvious. They do not announce themselves with alarming variable names or suspicious comments. They are embedded in architectural decisions, obscured by abstraction layers, and laundered through the language of optimization, performance, and business requirements. By the time they become public scandals, the engineers who built them have often been promoted, departed, or distanced from the work entirely.

At WhistleDev, we have spent months speaking with current and former engineers across the industry. What follows is an examination of seven patterns that consistently evade detection — and the tools developers can use to surface them.

1. Surveillance Telemetry Dressed as Analytics

User analytics are a legitimate engineering concern. Understanding how people navigate a product helps teams make better decisions. The line between analytics and surveillance, however, is crossed more often than most product documentation acknowledges.

The practice looks like this: an SDK or telemetry module collects data that far exceeds what is necessary for stated product improvement purposes. Keystroke timing, clipboard contents, precise geolocation updates every few seconds, or behavioral fingerprinting data gets bundled into analytics payloads and shipped to first- or third-party servers — sometimes without meaningful user consent.

This is not hypothetical. In 2022, a widely covered investigation revealed that several popular iOS applications were capturing full screen recordings of user sessions, including sensitive financial and personal data, without disclosing this in their privacy policies. The engineers who built those features were following product requirements. Some later said they assumed legal had reviewed the consent language.

How to spot it: Audit outbound network calls in your application, particularly from third-party SDKs. Tools like Charles Proxy, mitmproxy, or Wireshark can expose what data is actually leaving the device. Compare payload contents against your stated privacy policy. If there is a gap, document it.

2. Deliberate Technical Debt as a Competitive Moat

Technical debt is a natural byproduct of moving quickly. Strategic technical debt — debt that is deliberately introduced or preserved to make migration, competition, or regulatory compliance harder — is something else entirely.

This pattern often emerges when a company acquires a competitor or faces pressure to comply with data portability requirements. Engineers are instructed, explicitly or implicitly, to maintain tightly coupled architectures, avoid standard data formats, or resist documentation efforts that would make the system legible to outside auditors.

A former staff engineer at a major US cloud services company, speaking on background, described being asked to "not prioritize" the development of a data export feature for enterprise clients. "It was never written down anywhere," they said. "But everyone understood that making it easy to leave was not a product goal."

How to spot it: Look for architectural decisions that seem to create unnecessary coupling without technical justification. Document instances where export, interoperability, or portability features are deprioritized in sprint planning without clear engineering rationale.

3. Dark Patterns Encoded at the Framework Level

Most discussions of dark patterns focus on UX design — the pre-checked consent boxes, the difficult-to-find unsubscribe links. But dark patterns can be implemented at the code level in ways that make them invisible to designers and product managers reviewing mockups.

Examples include: default API parameters that enable data sharing unless explicitly disabled, session persistence logic that re-authenticates users without re-requesting consent, and notification permission prompts that are triggered by backend flag changes rather than meaningful user actions.

The Federal Trade Commission has increasingly scrutinized dark patterns following its 2022 report on the subject, and several enforcement actions have named specific implementation details as evidence of deceptive practice.

How to spot it: Review default parameter values for any consent, sharing, or notification-related API calls. Trace the logic that governs when permission prompts are displayed and who controls the triggering conditions.

4. Algorithmic Amplification Without Disclosure

Recommendation systems are among the most consequential pieces of software ever deployed at scale. They are also among the least transparent — not just to users, but often to the engineers who maintain them.

The ethical concern here is not that these systems exist; it is that they are frequently tuned to optimize for engagement metrics that correlate with harmful content amplification, and that this tuning is deliberately obscured in internal documentation and public communications.

Internal documents from multiple major platforms, surfaced through whistleblower disclosures and subsequent litigation, have shown that engineers and data scientists raised concerns about engagement-optimized recommendation systems internally — and that those concerns were documented, acknowledged, and then set aside in favor of growth targets.

How to spot it: Request access to the objective functions and reward signals used to train or tune recommendation systems you work adjacent to. Document any internal communications that acknowledge harmful amplification effects. Preserve these records outside of company systems.

5. Shadow Logging and Undisclosed Data Retention

Production systems routinely generate logs for debugging and monitoring purposes. What is less commonly disclosed is the practice of retaining those logs far beyond stated data retention policies, or of logging user-level data in debug pipelines that are technically outside the scope of privacy policy commitments.

This pattern is particularly common during periods of rapid growth, when engineering teams prioritize observability over compliance, and the resulting data accumulation is rationalized as a temporary state that never gets cleaned up.

The 2018 Cambridge Analytica scandal, while primarily a policy failure, included engineering decisions about data retention and API access that dramatically exceeded what users had consented to. Engineers who built those systems later testified that they were following product specifications.

How to spot it: Review your organization's actual log retention configurations against its stated data retention policy. Identify any logging pipelines that capture user-identifiable data and verify whether those pipelines are covered by existing privacy policy language.

6. Accessibility as a Checkbox, Not a Commitment

Accessibility compliance — meeting WCAG standards, ensuring screen reader compatibility, supporting keyboard navigation — is legally required under the Americans with Disabilities Act for many digital services. It is also one of the most commonly gamed engineering requirements in the industry.

The pattern: accessibility features are implemented in ways that technically pass automated audits but fail real-world use. ARIA labels that are present but semantically meaningless, focus management that is technically implemented but practically unusable, and color contrast ratios that meet minimum thresholds only in specific display modes.

This is not merely a UX failure. It is a civil rights issue, and US federal courts have increasingly ruled accordingly. Engineers who knowingly implement accessibility theater — features designed to satisfy auditors rather than users — are participating in a form of institutional discrimination.

How to spot it: Test accessibility features with actual assistive technologies, not just automated scanners. Tools like NVDA, VoiceOver, and JAWS will expose failures that axe or Lighthouse miss. Document the gap between audit results and real-world performance.

7. Security Vulnerabilities Classified as Features

Perhaps the most direct form of unethical coding practice is the deliberate misclassification of security vulnerabilities. This occurs when a known security flaw is internally documented as a "known limitation," a "design decision," or a "low-priority enhancement" in order to avoid the disclosure obligations, remediation costs, or reputational consequences that a formal vulnerability classification would trigger.

This practice has appeared in litigation involving major US technology and automotive companies. In several cases, internal communications showed that engineering and legal teams were aware of security issues that were later characterized as undisclosed to customers.

How to spot it: Review how security-related tickets are categorized in your organization's issue tracker. Look for patterns in which issues with potential security implications are systematically labeled in ways that exclude them from security review pipelines or compliance reporting.

Your Documentation Toolkit

Identifying unethical practices is only the first step. Documentation is what transforms an observation into a reportable finding:

Once you have documented a concern, refer to WhistleDev's disclosure guide for the appropriate reporting channels — internal, regulatory, or coordinated disclosure — depending on the nature and severity of what you have found.

The engineers who build these systems are not passive participants. The code you write is a reflection of the values you are willing to enforce, or willing to ignore. Knowing what to look for is the beginning of accountability.

WhistleDev accepts confidential tips and technical documentation from developers at all levels. Submit securely at whistledev.com/submit.

All Articles

Related Articles

Speak Up, Stay Standing: A Developer's Legal and Career Survival Guide to Reporting Security Vulnerabilities

Speak Up, Stay Standing: A Developer's Legal and Career Survival Guide to Reporting Security Vulnerabilities